From 61cc5e157391c0b4496f0b779f09af027d599394 Mon Sep 17 00:00:00 2001 From: xxssyyyyssxx Date: Tue, 2 Nov 2021 17:33:34 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A2=84=E7=AE=97=E8=A1=A8=E5=9F=BA=E6=9C=AC?= =?UTF-8?q?=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/backend/ProjectController.java | 9 ++ .../work/model/ProjectBudgetCostDetail.java | 129 ++++++++++++++++ .../ProjectBudgetCostDetailRepository.java | 9 ++ .../ProjectBudgetCostProjectManageDetail.java | 138 ++++++++++++++++++ ...dgetCostProjectManageDetailRepository.java | 9 ++ .../work/model/ProjectBudgetIncomeDetail.java | 119 +++++++++++++++ .../ProjectBudgetIncomeDetailRepository.java | 9 ++ .../work/service/ProjectBudgetService.java | 71 +++++++++ .../palmte/work/service/ProjectService.java | 28 +++- .../templates/admin/project_budget_edit.ftl | 84 +++++------ 10 files changed, 556 insertions(+), 49 deletions(-) create mode 100644 src/main/java/cn/palmte/work/model/ProjectBudgetCostDetail.java create mode 100644 src/main/java/cn/palmte/work/model/ProjectBudgetCostDetailRepository.java create mode 100644 src/main/java/cn/palmte/work/model/ProjectBudgetCostProjectManageDetail.java create mode 100644 src/main/java/cn/palmte/work/model/ProjectBudgetCostProjectManageDetailRepository.java create mode 100644 src/main/java/cn/palmte/work/model/ProjectBudgetIncomeDetail.java create mode 100644 src/main/java/cn/palmte/work/model/ProjectBudgetIncomeDetailRepository.java 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 3b36c6d..010a532 100644 --- a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java +++ b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java @@ -145,6 +145,15 @@ public class ProjectController extends BaseController{ return "admin/project_budget_edit"; } + /** + * 进行项目预算保存 + */ + @RequestMapping("/budgetEditSave") + public String budgetEditSave(Project project, BudgetBean budgetBean, + Map model) { + projectService.budgetEditSave(project, budgetBean, InterfaceUtil.getAdmin(), ApproveStatusEnum.APPROVAL_UNCOMMIT); + return "redirect:/project/list"; + } @InitBinder public void initBinder(WebDataBinder webDataBinder){ webDataBinder.addCustomFormatter(new DateFormatter("yyyy-MM-dd")); diff --git a/src/main/java/cn/palmte/work/model/ProjectBudgetCostDetail.java b/src/main/java/cn/palmte/work/model/ProjectBudgetCostDetail.java new file mode 100644 index 0000000..0997f89 --- /dev/null +++ b/src/main/java/cn/palmte/work/model/ProjectBudgetCostDetail.java @@ -0,0 +1,129 @@ +package cn.palmte.work.model; + +import org.hibernate.annotations.GenericGenerator; + +import javax.persistence.*; +import java.math.BigDecimal; + +/** + * 项目预算成本明细表 + */ +@Entity +@Table(name = "project_budget_cost_detail") +public class ProjectBudgetCostDetail { + public static final int TYPE_DEVICE = 1; + public static final int TYPE_BUILD = 2; + public static final int TYPE_SERVICE = 3; + public static final int TYPE_OHTER = 4; + + /** + * id + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @GenericGenerator(name = "persistenceGenerator", strategy = "increment") + private Integer id; + + @Column(name = "project_id") + private int projectId; + + private int type; + private int category; + + private String name; + + private String unit; + private int amount; + private BigDecimal price; + + @Column(name = "tax_rate") + private BigDecimal taxRate; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public int getProjectId() { + return projectId; + } + + public void setProjectId(int projectId) { + this.projectId = projectId; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public int getCategory() { + return category; + } + + public void setCategory(int category) { + this.category = category; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public int getAmount() { + return amount; + } + + public void setAmount(int amount) { + this.amount = amount; + } + + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public BigDecimal getTaxRate() { + return taxRate; + } + + public void setTaxRate(BigDecimal taxRate) { + this.taxRate = taxRate; + } + + public BigDecimal getTotalTaxInclude(){ + if(null == price){ + return null; + } + return price.multiply(new BigDecimal(amount)); + } + public BigDecimal getTotalTaxExclude(){ + BigDecimal totalTaxInclude = getTotalTaxInclude(); + if(null == totalTaxInclude || taxRate == null){ + return null; + } + + //不含税总金额=含税总金额/(1+税率) + return totalTaxInclude.divide(taxRate.divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP), 2, BigDecimal.ROUND_HALF_UP); + } +} \ No newline at end of file diff --git a/src/main/java/cn/palmte/work/model/ProjectBudgetCostDetailRepository.java b/src/main/java/cn/palmte/work/model/ProjectBudgetCostDetailRepository.java new file mode 100644 index 0000000..32b77e1 --- /dev/null +++ b/src/main/java/cn/palmte/work/model/ProjectBudgetCostDetailRepository.java @@ -0,0 +1,9 @@ +package cn.palmte.work.model; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ProjectBudgetCostDetailRepository extends JpaRepository { + List findAllByProjectIdEquals(int id); +} diff --git a/src/main/java/cn/palmte/work/model/ProjectBudgetCostProjectManageDetail.java b/src/main/java/cn/palmte/work/model/ProjectBudgetCostProjectManageDetail.java new file mode 100644 index 0000000..6a265ab --- /dev/null +++ b/src/main/java/cn/palmte/work/model/ProjectBudgetCostProjectManageDetail.java @@ -0,0 +1,138 @@ +package cn.palmte.work.model; + +import org.hibernate.annotations.GenericGenerator; + +import javax.persistence.*; +import java.math.BigDecimal; + +/** + * 项目预算项目管理成本明细表 + */ +@Entity +@Table(name = "project_budget_cost_project_manage_detail") +public class ProjectBudgetCostProjectManageDetail { + public static final int TYPE_PERSON = 1; + public static final int TYPE_BUSINESS = 2; + public static final int TYPE_OHTER = 3; + + /** + * id + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @GenericGenerator(name = "persistenceGenerator", strategy = "increment") + private Integer id; + + @Column(name = "project_id") + private int projectId; + + private int type; + + private String name; + private String detail; + + private String unit; + private int amount; + private BigDecimal price; + + @Column(name = "predict_method") + private String predictMethod; + @Column(name = "predict_why") + private String predictWhy; + private String remark; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public int getProjectId() { + return projectId; + } + + public void setProjectId(int projectId) { + this.projectId = projectId; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public int getAmount() { + return amount; + } + + public void setAmount(int amount) { + this.amount = amount; + } + + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public String getDetail() { + return detail; + } + + public void setDetail(String detail) { + this.detail = detail; + } + + public String getPredictMethod() { + return predictMethod; + } + + public void setPredictMethod(String predictMethod) { + this.predictMethod = predictMethod; + } + + public String getPredictWhy() { + return predictWhy; + } + + public void setPredictWhy(String predictWhy) { + this.predictWhy = predictWhy; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public BigDecimal getTotal(){ + if(null == price){ + return null; + } + return price.multiply(new BigDecimal(amount)); + } +} \ No newline at end of file diff --git a/src/main/java/cn/palmte/work/model/ProjectBudgetCostProjectManageDetailRepository.java b/src/main/java/cn/palmte/work/model/ProjectBudgetCostProjectManageDetailRepository.java new file mode 100644 index 0000000..8918863 --- /dev/null +++ b/src/main/java/cn/palmte/work/model/ProjectBudgetCostProjectManageDetailRepository.java @@ -0,0 +1,9 @@ +package cn.palmte.work.model; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ProjectBudgetCostProjectManageDetailRepository extends JpaRepository { + List findAllByProjectIdEquals(int id); +} diff --git a/src/main/java/cn/palmte/work/model/ProjectBudgetIncomeDetail.java b/src/main/java/cn/palmte/work/model/ProjectBudgetIncomeDetail.java new file mode 100644 index 0000000..68203a2 --- /dev/null +++ b/src/main/java/cn/palmte/work/model/ProjectBudgetIncomeDetail.java @@ -0,0 +1,119 @@ +package cn.palmte.work.model; + +import org.hibernate.annotations.GenericGenerator; + +import javax.persistence.*; +import java.math.BigDecimal; + +/** + * 项目预算收入明细表 + */ +@Entity +@Table(name = "project_budget_income_detail") +public class ProjectBudgetIncomeDetail { + public static final int TYPE_DEVICE = 1; + public static final int TYPE_ENGINEER = 2; + public static final int TYPE_SERVICE = 3; + + /** + * id + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @GenericGenerator(name = "persistenceGenerator", strategy = "increment") + private Integer id; + + @Column(name = "project_id") + private int projectId; + + private int type; + + private String name; + + private String unit; + private int amount; + private BigDecimal price; + + @Column(name = "tax_rate") + private BigDecimal taxRate; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public int getProjectId() { + return projectId; + } + + public void setProjectId(int projectId) { + this.projectId = projectId; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public int getAmount() { + return amount; + } + + public void setAmount(int amount) { + this.amount = amount; + } + + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public BigDecimal getTaxRate() { + return taxRate; + } + + public void setTaxRate(BigDecimal taxRate) { + this.taxRate = taxRate; + } + + public BigDecimal getTotalTaxInclude(){ + if(null == price){ + return null; + } + return price.multiply(new BigDecimal(amount)); + } + public BigDecimal getTotalTaxExclude(){ + BigDecimal totalTaxInclude = getTotalTaxInclude(); + if(null == totalTaxInclude || taxRate == null){ + return null; + } + + //不含税总金额=含税总金额/(1+税率) + return totalTaxInclude.divide(taxRate.divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP), 2, BigDecimal.ROUND_HALF_UP); + } +} \ No newline at end of file diff --git a/src/main/java/cn/palmte/work/model/ProjectBudgetIncomeDetailRepository.java b/src/main/java/cn/palmte/work/model/ProjectBudgetIncomeDetailRepository.java new file mode 100644 index 0000000..f7a48e6 --- /dev/null +++ b/src/main/java/cn/palmte/work/model/ProjectBudgetIncomeDetailRepository.java @@ -0,0 +1,9 @@ +package cn.palmte.work.model; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ProjectBudgetIncomeDetailRepository extends JpaRepository { + List findAllByProjectIdEquals(int id); +} diff --git a/src/main/java/cn/palmte/work/service/ProjectBudgetService.java b/src/main/java/cn/palmte/work/service/ProjectBudgetService.java index ae81a09..c4a0fac 100644 --- a/src/main/java/cn/palmte/work/service/ProjectBudgetService.java +++ b/src/main/java/cn/palmte/work/service/ProjectBudgetService.java @@ -21,6 +21,12 @@ public class ProjectBudgetService { private ProjectBudgetCostRepository projectBudgetCostRepository; @Autowired private ProjectBudgetCostManageRepository projectBudgetCostManageRepository; + @Autowired + private ProjectBudgetIncomeDetailRepository projectBudgetIncomeDetailRepository; + @Autowired + private ProjectBudgetCostDetailRepository projectBudgetCostDetailRepository; + @Autowired + private ProjectBudgetCostProjectManageDetailRepository projectBudgetCostProjectManageDetailRepository; public void clearBudget(Project project){ @@ -194,4 +200,69 @@ public class ProjectBudgetService { return budgetBean; } + + + /** + * 清空项目的收入明细 + */ + public void clearBudgetIncomeDetail(Project project){ + List incomeDetails = projectBudgetIncomeDetailRepository.findAllByProjectIdEquals(project.getId()); + if(CollectionUtil.isNotEmpty(incomeDetails)){ + projectBudgetIncomeDetailRepository.deleteInBatch(incomeDetails); + } + } + + /** + * 保存项目的收入明细 + */ + public void saveBudgetIncomeDetail(Project project, List detailList){ + if(CollectionUtil.isNotEmpty(detailList)){ + for (ProjectBudgetIncomeDetail projectBudgetIncomeDetail : detailList) { + projectBudgetIncomeDetail.setProjectId(project.getId()); + } + projectBudgetIncomeDetailRepository.save(detailList); + } + } + /** + * 清空项目的成本明细 + */ + public void clearBudgetCostDetail(Project project){ + List costDetails = projectBudgetCostDetailRepository.findAllByProjectIdEquals(project.getId()); + if(CollectionUtil.isNotEmpty(costDetails)){ + projectBudgetCostDetailRepository.deleteInBatch(costDetails); + } + } + + /** + * 保存项目的成本明细 + */ + public void saveBudgetCostDetail(Project project, List detailList){ + if(CollectionUtil.isNotEmpty(detailList)){ + for (ProjectBudgetCostDetail projectBudgetCostDetail : detailList) { + projectBudgetCostDetail.setProjectId(project.getId()); + } + projectBudgetCostDetailRepository.save(detailList); + } + } + /** + * 清空项目的项目管理成本明细 + */ + public void clearBudgetCostProjectManageDetail(Project project){ + List costDetails = projectBudgetCostProjectManageDetailRepository.findAllByProjectIdEquals(project.getId()); + if(CollectionUtil.isNotEmpty(costDetails)){ + projectBudgetCostProjectManageDetailRepository.deleteInBatch(costDetails); + } + } + + /** + * 保存项目的项目管理成本明细 + */ + public void saveBudgetCostProjectManageDetail(Project project, List detailList){ + if(CollectionUtil.isNotEmpty(detailList)){ + for (ProjectBudgetCostProjectManageDetail projectBudgetCostProjectManageDetail : detailList) { + projectBudgetCostProjectManageDetail.setProjectId(project.getId()); + } + projectBudgetCostProjectManageDetailRepository.save(detailList); + } + } } diff --git a/src/main/java/cn/palmte/work/service/ProjectService.java b/src/main/java/cn/palmte/work/service/ProjectService.java index 69ab322..4e40581 100644 --- a/src/main/java/cn/palmte/work/service/ProjectService.java +++ b/src/main/java/cn/palmte/work/service/ProjectService.java @@ -1,9 +1,6 @@ package cn.palmte.work.service; -import cn.palmte.work.bean.ApproveStatusEnum; -import cn.palmte.work.bean.EstimateBean; -import cn.palmte.work.bean.StatusEnum; -import cn.palmte.work.bean.TypeEnum; +import cn.palmte.work.bean.*; import cn.palmte.work.model.Admin; import cn.palmte.work.model.Project; import cn.palmte.work.model.ProjectRepository; @@ -29,6 +26,8 @@ public class ProjectService { private ProjectRepository projectRepository; @Autowired private ProjectEstimateService projectEstimateService; + @Autowired + private ProjectBudgetService projectBudgetService; private QueryHelper getQueryHelper(Map searchInfo, int pageNumber, int pageSize) { @@ -102,12 +101,13 @@ public class ProjectService { @Transactional(rollbackFor = RuntimeException.class) public Project estimateEditSave(Project project, EstimateBean estimateBean, Admin admin, ApproveStatusEnum approveStatusEnum) { Project p = editProject(project, admin, approveStatusEnum); + p.setApproveStatusEstimate(approveStatusEnum.getApproveStatus()); + p = projectRepository.saveAndFlush(p); //清空重新保存概算信息 - projectEstimateService.clearEstimate(project); + projectEstimateService.clearEstimate(p); projectEstimateService.saveEstimate(p, estimateBean); return p; } - private Project addProject(Project project, Admin admin, ApproveStatusEnum approveStatusEnum) { project.setTypeDesc(TypeEnum.parseType(project.getType()).getTypeDesc()); project.setStatus(StatusEnum.CREATED.getStatus()); @@ -144,6 +144,20 @@ public class ProjectService { p.setApproveStatusEstimate(approveStatusEnum.getApproveStatus()); - return projectRepository.saveAndFlush(p); + return p; + } + + /** + * 编辑预算保存项目 + */ + @Transactional(rollbackFor = RuntimeException.class) + public Project budgetEditSave(Project project, BudgetBean budgetBean, Admin admin, ApproveStatusEnum approveStatusEnum) { + Project p = editProject(project, admin, approveStatusEnum); + p.setApproveStatusEstimate(approveStatusEnum.getApproveStatus()); + p = projectRepository.saveAndFlush(p); + //清空重新保存概算信息 + projectBudgetService.clearBudget(p); + projectBudgetService.saveBudget(p, budgetBean); + return p; } } diff --git a/src/main/resources/templates/admin/project_budget_edit.ftl b/src/main/resources/templates/admin/project_budget_edit.ftl index fd90810..dd7c148 100644 --- a/src/main/resources/templates/admin/project_budget_edit.ftl +++ b/src/main/resources/templates/admin/project_budget_edit.ftl @@ -191,26 +191,26 @@ 收入 设备类 - - + + 收入 工程类 - - + + 收入 服务类 - - + + 合计 - - + + @@ -230,50 +230,50 @@ 成本 采购成本 设备 - - + + 成本 采购成本 施工 - - + + 成本 采购成本 服务 - - + + 成本 采购成本 其他 - - + + 成本 项目管理成本 项目管理成本 - - + + 成本 其他 其他 - - + + 合计 - - + + @@ -289,12 +289,12 @@ 财务费用 资金占用成本 - + 公司管理费用 - + @@ -309,13 +309,13 @@ 项目毛利 - - + + 项目贡献利润率 - - + + @@ -329,59 +329,59 @@ 销售商品、提供劳务收到的现金a - + 收到的税费返还b - + 收到其他与经营活动有关的现金c - + 购买商品、接受劳务支付的现d - + 支付的各项税费e - + 支付其他与经营活动有关的现金f - + 经营活动产生的现金流量净额g - + 投资活动现金流入h - + 投资活动现金流出i - + 投资活动产生的现金流量净额j - + 融资资金流入k - + 还款资金流出l - + 筹资活动产生的现金流量净额m - + 货币资金净增加额n - +