From 9cff2184bdf033d5f6f88bea79003075bb29de5a Mon Sep 17 00:00:00 2001 From: xxssyyyyssxx Date: Fri, 5 Nov 2021 12:19:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=B5=84=E9=87=91=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E4=B8=8B=E9=9D=A2=E7=9A=84=E5=B0=8F=E8=A1=A8=E7=9A=84?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E6=95=B0=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../palmte/work/bean/ProjectConfigBean.java | 34 +++++++++++++ .../ProjectUnderwrittenPlanStatisticBean.java | 46 +++++++++++++++++ .../controller/backend/ProjectController.java | 9 +++- .../java/cn/palmte/work/model/Project.java | 26 ++++++++++ .../work/model/ProjectBudgetPlanDetail.java | 13 +++++ .../work/service/ProjectBudgetService.java | 48 +++++++++++++++++- .../palmte/work/service/ProjectService.java | 9 ++++ .../cn/palmte/work/utils/FreeMarkerUtil.java | 25 ++++++++++ src/main/java/cn/palmte/work/utils/Utils.java | 17 +++++++ .../static/assets/js/project_budget_plan.js | 50 ++++++++++++++++++- .../templates/admin/project_budget_edit.ftl | 27 ++++++++-- 11 files changed, 295 insertions(+), 9 deletions(-) create mode 100644 src/main/java/cn/palmte/work/bean/ProjectConfigBean.java create mode 100644 src/main/java/cn/palmte/work/bean/ProjectUnderwrittenPlanStatisticBean.java create mode 100644 src/main/java/cn/palmte/work/utils/FreeMarkerUtil.java diff --git a/src/main/java/cn/palmte/work/bean/ProjectConfigBean.java b/src/main/java/cn/palmte/work/bean/ProjectConfigBean.java new file mode 100644 index 0000000..165d66e --- /dev/null +++ b/src/main/java/cn/palmte/work/bean/ProjectConfigBean.java @@ -0,0 +1,34 @@ +package cn.palmte.work.bean; + +import java.math.BigDecimal; + +/** + * 项目相关的配置 + * @author xiongshiyan at 2021/11/5 , contact me with email yanshixiong@126.com or phone 15208384257 + */ +public class ProjectConfigBean { + /** + * 资金利率 + */ + private BigDecimal underwrittenTaxRate; + /** + * 项目贡献利润率阀值 + */ + private BigDecimal projectContributionProfitRateThreshold; + + public BigDecimal getUnderwrittenTaxRate() { + return underwrittenTaxRate; + } + + public void setUnderwrittenTaxRate(BigDecimal underwrittenTaxRate) { + this.underwrittenTaxRate = underwrittenTaxRate; + } + + public BigDecimal getProjectContributionProfitRateThreshold() { + return projectContributionProfitRateThreshold; + } + + public void setProjectContributionProfitRateThreshold(BigDecimal projectContributionProfitRateThreshold) { + this.projectContributionProfitRateThreshold = projectContributionProfitRateThreshold; + } +} diff --git a/src/main/java/cn/palmte/work/bean/ProjectUnderwrittenPlanStatisticBean.java b/src/main/java/cn/palmte/work/bean/ProjectUnderwrittenPlanStatisticBean.java new file mode 100644 index 0000000..8c158cc --- /dev/null +++ b/src/main/java/cn/palmte/work/bean/ProjectUnderwrittenPlanStatisticBean.java @@ -0,0 +1,46 @@ +package cn.palmte.work.bean; + +import java.math.BigDecimal; + +/** + * 项目预算资金计划表统计信息 + * @author xiongshiyan at 2021/11/5 , contact me with email yanshixiong@126.com or phone 15208384257 + */ +public class ProjectUnderwrittenPlanStatisticBean { + /** + * 峰值月份 + */ + private String maxMonth; + /** + * 峰值金额 + */ + private BigDecimal amount; + /** + * 资金利息 + */ + private BigDecimal capitalInterest; + + public String getMaxMonth() { + return maxMonth; + } + + public void setMaxMonth(String maxMonth) { + this.maxMonth = maxMonth; + } + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + public BigDecimal getCapitalInterest() { + return capitalInterest; + } + + public void setCapitalInterest(BigDecimal capitalInterest) { + this.capitalInterest = capitalInterest; + } +} 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 875d071..b8bfe71 100644 --- a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java +++ b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java @@ -8,6 +8,7 @@ import cn.palmte.work.model.*; import cn.palmte.work.service.ProjectBudgetService; import cn.palmte.work.service.ProjectEstimateService; import cn.palmte.work.service.ProjectService; +import cn.palmte.work.utils.FreeMarkerUtil; import cn.palmte.work.utils.InterfaceUtil; import cn.palmte.work.utils.Utils; import cn.palmte.work.utils.excel.ExportUtils; @@ -150,8 +151,12 @@ public class ProjectController extends BaseController{ List projectBudgetPlanDetails = projectBudgetService.getProjectBudgetPlanDetails(project); //资金计划明细 model.put("projectBudgetPlanDetails", projectBudgetPlanDetails); - //资金计划总 - model.put("projectBudgetPlanDetailTotal", projectBudgetService.getProjectBudgetPlanDetailTotal(projectBudgetPlanDetails)); + //资金计划总【上面汇总表】 + model.put("projectBudgetPlanDetailTotal", projectBudgetService.getProjectBudgetPlanDetailTotal(project, projectBudgetPlanDetails)); + //资金计划表中的统计信息【下面资金小表】 + model.put("underwrittenPlanStatistic", projectBudgetService.getProjectUnderwrittenPlanStatisticBean(projectBudgetPlanDetails)); + //freemarker可以利用的静态方法 + model.put("Utils", FreeMarkerUtil.fromStaticPackage("cn.palmte.work.utils.Utils")); return "admin/project_budget_edit"; } diff --git a/src/main/java/cn/palmte/work/model/Project.java b/src/main/java/cn/palmte/work/model/Project.java index 2a88614..e3ba1b3 100644 --- a/src/main/java/cn/palmte/work/model/Project.java +++ b/src/main/java/cn/palmte/work/model/Project.java @@ -134,6 +134,16 @@ public class Project { */ @Column(name = "main_contract_collection_terms") private String mainContractCollectionTerms; + /** + * 项目创建时的配置的阀值 + */ + @Column(name = "project_contribution_profit_rate_threshold") + private BigDecimal projectContributionProfitRateThreshold; + /** + * 项目创建配置的年利率 + */ + @Column(name = "underwritten_tax_rate") + private BigDecimal underwrittenTaxRate; /** * 创建时间 */ @@ -389,6 +399,22 @@ public class Project { this.mainContractCollectionTerms = mainContractCollectionTerms; } + public BigDecimal getProjectContributionProfitRateThreshold() { + return projectContributionProfitRateThreshold; + } + + public void setProjectContributionProfitRateThreshold(BigDecimal projectContributionProfitRateThreshold) { + this.projectContributionProfitRateThreshold = projectContributionProfitRateThreshold; + } + + public BigDecimal getUnderwrittenTaxRate() { + return underwrittenTaxRate; + } + + public void setUnderwrittenTaxRate(BigDecimal underwrittenTaxRate) { + this.underwrittenTaxRate = underwrittenTaxRate; + } + public Date getCreateTime() { return createTime; } diff --git a/src/main/java/cn/palmte/work/model/ProjectBudgetPlanDetail.java b/src/main/java/cn/palmte/work/model/ProjectBudgetPlanDetail.java index b950179..c310153 100644 --- a/src/main/java/cn/palmte/work/model/ProjectBudgetPlanDetail.java +++ b/src/main/java/cn/palmte/work/model/ProjectBudgetPlanDetail.java @@ -69,6 +69,11 @@ public class ProjectBudgetPlanDetail { */ @Column(name = "fund_balance") private BigDecimal fundBalance; + /** + * 项目创建配置的年利率 + */ + @Column(name = "underwritten_tax_rate") + private BigDecimal underwrittenTaxRate; /** *资金利息 */ @@ -181,6 +186,14 @@ public class ProjectBudgetPlanDetail { this.fundBalance = fundBalance; } + public BigDecimal getUnderwrittenTaxRate() { + return underwrittenTaxRate; + } + + public void setUnderwrittenTaxRate(BigDecimal underwrittenTaxRate) { + this.underwrittenTaxRate = underwrittenTaxRate; + } + public BigDecimal getCapitalInterest() { return capitalInterest; } diff --git a/src/main/java/cn/palmte/work/service/ProjectBudgetService.java b/src/main/java/cn/palmte/work/service/ProjectBudgetService.java index 75e4881..7c6d99e 100644 --- a/src/main/java/cn/palmte/work/service/ProjectBudgetService.java +++ b/src/main/java/cn/palmte/work/service/ProjectBudgetService.java @@ -1,6 +1,8 @@ package cn.palmte.work.service; import cn.palmte.work.bean.BudgetBean; +import cn.palmte.work.bean.ProjectConfigBean; +import cn.palmte.work.bean.ProjectUnderwrittenPlanStatisticBean; import cn.palmte.work.model.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -346,6 +348,7 @@ public class ProjectBudgetService { if(CollectionUtil.isNotEmpty(detailList)){ for (ProjectBudgetPlanDetail projectBudgetPlanDetail : detailList) { projectBudgetPlanDetail.setProjectId(project.getId()); + projectBudgetPlanDetail.setUnderwrittenTaxRate(project.getUnderwrittenTaxRate()); } projectBudgetPlanDetailRepository.save(detailList); } @@ -361,7 +364,7 @@ public class ProjectBudgetService { /** * 根据每个月的计算资金计划的总 */ - public ProjectBudgetPlanDetail getProjectBudgetPlanDetailTotal(List projectBudgetPlanDetails) { + public ProjectBudgetPlanDetail getProjectBudgetPlanDetailTotal(Project project, List projectBudgetPlanDetails) { ProjectBudgetPlanDetail projectBudgetPlanDetail = new ProjectBudgetPlanDetail(); BigDecimal deviceCost = new BigDecimal(0); BigDecimal engineerCost = new BigDecimal(0); @@ -375,6 +378,7 @@ public class ProjectBudgetService { BigDecimal capitalInterest = new BigDecimal(0); BigDecimal underwrittenPlan = new BigDecimal(0); BigDecimal repaymentPlan = new BigDecimal(0); + /*BigDecimal underwrittenTaxRate = project.getUnderwrittenTaxRate();*/ if(CollectionUtil.isNotEmpty(projectBudgetPlanDetails)){ for (ProjectBudgetPlanDetail budgetPlan : projectBudgetPlanDetails) { @@ -407,9 +411,51 @@ public class ProjectBudgetService { projectBudgetPlanDetail.setEarnestMoneyIncome(earnestMoneyIncome); projectBudgetPlanDetail.setTotalIncome(totalIncome); projectBudgetPlanDetail.setFundBalance(fundBalance); + /*projectBudgetPlanDetail.setUnderwrittenTaxRate(underwrittenTaxRate);*/ projectBudgetPlanDetail.setCapitalInterest(capitalInterest); projectBudgetPlanDetail.setUnderwrittenPlan(underwrittenPlan); projectBudgetPlanDetail.setRepaymentPlan(repaymentPlan); return projectBudgetPlanDetail; } + + public ProjectConfigBean getProjectConfigBeanConfig(){ + //TODO 从数据库配置中来 + ProjectConfigBean projectConfigBean = new ProjectConfigBean(); + projectConfigBean.setUnderwrittenTaxRate(new BigDecimal("5.66")); + projectConfigBean.setProjectContributionProfitRateThreshold(new BigDecimal("5")); + return projectConfigBean; + } + + /** + * 根据资金计划获取资金使用统计值 + * 月份去峰值月份 + * 峰值累计 + * 资金利息累计 + */ + public ProjectUnderwrittenPlanStatisticBean getProjectUnderwrittenPlanStatisticBean(List projectBudgetPlanDetails){ + ProjectUnderwrittenPlanStatisticBean bean = new ProjectUnderwrittenPlanStatisticBean(); + if(CollectionUtil.isEmpty(projectBudgetPlanDetails)){ + return bean; + } + + BigDecimal amount = new BigDecimal(0); + BigDecimal capitalInterest = new BigDecimal(0); + BigDecimal max = new BigDecimal(0); + String maxMonth = ""; + for (ProjectBudgetPlanDetail projectBudgetPlanDetail : projectBudgetPlanDetails) { + capitalInterest = capitalInterest.add(projectBudgetPlanDetail.getCapitalInterest()); + BigDecimal underwrittenPlan = projectBudgetPlanDetail.getUnderwrittenPlan(); + amount = amount.add(underwrittenPlan); + if(underwrittenPlan.compareTo(max)>0){ + max = underwrittenPlan; + maxMonth = projectBudgetPlanDetail.getMonth(); + } + } + + bean.setMaxMonth(maxMonth); + bean.setAmount(amount); + bean.setCapitalInterest(capitalInterest); + + return bean; + } } diff --git a/src/main/java/cn/palmte/work/service/ProjectService.java b/src/main/java/cn/palmte/work/service/ProjectService.java index 43e4efd..09e9524 100644 --- a/src/main/java/cn/palmte/work/service/ProjectService.java +++ b/src/main/java/cn/palmte/work/service/ProjectService.java @@ -104,6 +104,11 @@ public class ProjectService { p.setStatus(StatusEnum.CREATED.getStatus()); p.setStatusDesc(StatusEnum.CREATED.getStatusDesc()); p.setApproveStatusEstimate(approveStatusEnum.getApproveStatus()); + + ProjectConfigBean projectConfigBeanConfig = projectBudgetService.getProjectConfigBeanConfig(); + project.setProjectContributionProfitRateThreshold(projectConfigBeanConfig.getProjectContributionProfitRateThreshold()); + project.setUnderwrittenTaxRate(projectConfigBeanConfig.getUnderwrittenTaxRate()); + p = projectRepository.saveAndFlush(p); //清空重新保存概算信息 projectEstimateService.clearEstimate(p); @@ -118,6 +123,10 @@ public class ProjectService { project.setCreatorId(admin.getId()); project.setCreatorName(admin.getUserName()); + ProjectConfigBean projectConfigBeanConfig = projectBudgetService.getProjectConfigBeanConfig(); + project.setProjectContributionProfitRateThreshold(projectConfigBeanConfig.getProjectContributionProfitRateThreshold()); + project.setUnderwrittenTaxRate(projectConfigBeanConfig.getUnderwrittenTaxRate()); + project.setApproveId(null); project.setApproveName(""); diff --git a/src/main/java/cn/palmte/work/utils/FreeMarkerUtil.java b/src/main/java/cn/palmte/work/utils/FreeMarkerUtil.java new file mode 100644 index 0000000..f5c96d7 --- /dev/null +++ b/src/main/java/cn/palmte/work/utils/FreeMarkerUtil.java @@ -0,0 +1,25 @@ +package cn.palmte.work.utils; + +import freemarker.ext.beans.BeansWrapper; +import freemarker.ext.beans.BeansWrapperBuilder; +import freemarker.template.TemplateHashModel; +import freemarker.template.Version; + +/** + * @author xiongshiyan at 2021/11/5 , contact me with email yanshixiong@126.com or phone 15208384257 + */ +public class FreeMarkerUtil { + public static TemplateHashModel fromStaticPackage(String packageName) { + try + { + BeansWrapperBuilder beansWrapperBuilder = new BeansWrapperBuilder(new Version(2,3,26)); + //BeansWrapper wrapper = BeansWrapper.getDefaultInstance(); + BeansWrapper wrapper = beansWrapperBuilder.build(); + TemplateHashModel staticModels = wrapper.getStaticModels(); + return (TemplateHashModel) staticModels.get(packageName); + }catch (Exception e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/src/main/java/cn/palmte/work/utils/Utils.java b/src/main/java/cn/palmte/work/utils/Utils.java index 4d4eb18..c919aaa 100644 --- a/src/main/java/cn/palmte/work/utils/Utils.java +++ b/src/main/java/cn/palmte/work/utils/Utils.java @@ -46,6 +46,23 @@ public class Utils { return PHONE_PATTERN.matcher(str).matches(); } + + /** + * 小数则保留两位小数 + * 整数就是整数 + */ + public static String format(Number number, String defaultValue){ + if (null == number) { + return defaultValue; + }else { + return new java.text.DecimalFormat("#0.##").format(number); + } + } + public static String format(Number number){ + return format(number, ""); + } + + public static void main(String[] args) throws Exception { AesCrypto aesCrypto = new AesCrypto("CDGXQHCJ-HHYC2021017"); String encoded = "fdKQaLHH1kt/pW3s4APoUA=="; 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 d3440f5..683d984 100644 --- a/src/main/resources/static/assets/js/project_budget_plan.js +++ b/src/main/resources/static/assets/js/project_budget_plan.js @@ -25,7 +25,7 @@ $(function () { */ function appendTrBudgetPlan() { var template = '\n' + - ' \n' + + ' \n' + ' \n' + ' \n' + ' \n' + @@ -75,6 +75,8 @@ function bindBudgetPlanDeleteBtn() { updateEachRepaymentPlan(); //更新资金利息 updateEachCapitalInterest(); + //更新垫资峰值月 + updateUnderwrittenInfo(); }); } @@ -103,6 +105,8 @@ function bindChangeableInputBudgetPlanDetail() { updateEachRepaymentPlan(); //更新资金利息 updateEachCapitalInterest(); + //更新垫资峰值月 + updateUnderwrittenInfo(); }); //工程支出改变 $(".input-changeable-engineer-cost-budget-plan").change(function () { @@ -127,6 +131,8 @@ function bindChangeableInputBudgetPlanDetail() { updateEachRepaymentPlan(); //更新资金利息 updateEachCapitalInterest(); + //更新垫资峰值月 + updateUnderwrittenInfo(); }); //经营性支出改变 $(".input-changeable-project-manage-cost-budget-plan").change(function () { @@ -151,6 +157,8 @@ function bindChangeableInputBudgetPlanDetail() { updateEachRepaymentPlan(); //更新资金利息 updateEachCapitalInterest(); + //更新垫资峰值月 + updateUnderwrittenInfo(); }); //保证金改变 $(".input-changeable-earnest-money-cost-budget-plan").change(function () { @@ -175,6 +183,8 @@ function bindChangeableInputBudgetPlanDetail() { updateEachRepaymentPlan(); //更新资金利息 updateEachCapitalInterest(); + //更新垫资峰值月 + updateUnderwrittenInfo(); }); //销售收款改变 @@ -198,6 +208,8 @@ function bindChangeableInputBudgetPlanDetail() { updateEachRepaymentPlan(); //更新资金利息 updateEachCapitalInterest(); + //更新垫资峰值月 + updateUnderwrittenInfo(); }); //保证金收款改变 $(".input-changeable-earnest-money-income-budget-plan").change(function () { @@ -220,6 +232,8 @@ function bindChangeableInputBudgetPlanDetail() { updateEachRepaymentPlan(); //更新资金利息 updateEachCapitalInterest(); + //更新垫资峰值月 + updateUnderwrittenInfo(); }); @@ -306,6 +320,8 @@ function updateEachUnderwrittenPlan() { //总垫资计划=所有月累加 $(".input-total-underwritten-plan-budget-plan").val(total); + //下放小表的垫资峰值金额 + $(".input-underwritten-plan-statistic-amount-budget-plan").val(total); } /** @@ -405,12 +421,13 @@ function calRepaymentPlan(income, cost, prevFundBalance) { * 更新每一行【即每个月】的资金利息 */ function updateEachCapitalInterest() { + var underwrittenPlanTaxRate = parseFloat($(".input-underwritten-plan-statistic-tax-rate-budget-plan").val()); 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; + var capitalInterest = underwrittenPlan*underwrittenPlanTaxRate/100/12; total += capitalInterest; $(this).val(capitalInterest); @@ -419,6 +436,35 @@ function updateEachCapitalInterest() { //总资金利息=所有月累加 $(".input-total-capital-interest-budget-plan").val(total); + //下方小表的资金利息 + $(".input-underwritten-plan-statistic-capital-interest-budget-plan").val(total); + //主页面上的财务费用 + $("input[name='costExpropriationTaxExclude']").val(total); +} + +/** + * 更新资金相关信息 + * + 垫资峰值时间 垫资最大的那一个月 + 垫资峰值金额 垫资累计 @see updateEachUnderwrittenPlan + 资金利息 垫资每月利息累加 @see updateEachCapitalInterest + */ +function updateUnderwrittenInfo() { + var max = 0; + var month = ''; + //找到每个月的垫资计划输入框 + $(".input-changeable-underwritten-plan-budget-plan").each(function (t) { + //找到当前月垫资计划 + var underwrittenPlan = parseFloat($(this).val()); + //当月比最大的还大,就取当月的 + if(underwrittenPlan > max){ + month = $(this).parent().parent().find(".input-changeable-month-budget-plan").val(); + max = underwrittenPlan; + } + }); + + //垫资峰值时间为每个月最大的那个月 + $(".input-underwritten-plan-statistic-max-month-budget-plan").val(month); } diff --git a/src/main/resources/templates/admin/project_budget_edit.ftl b/src/main/resources/templates/admin/project_budget_edit.ftl index 993fc28..e6d6fbd 100644 --- a/src/main/resources/templates/admin/project_budget_edit.ftl +++ b/src/main/resources/templates/admin/project_budget_edit.ftl @@ -1,8 +1,8 @@ <#assign base=request.contextPath /> + <#import "../common/defaultLayout.ftl" as defaultLayout> <@defaultLayout.layout> -