diff --git a/src/main/java/cn/palmte/work/bean/ApproveStatusEnum.java b/src/main/java/cn/palmte/work/bean/ApproveStatusEnum.java index 0660def..83b382b 100644 --- a/src/main/java/cn/palmte/work/bean/ApproveStatusEnum.java +++ b/src/main/java/cn/palmte/work/bean/ApproveStatusEnum.java @@ -4,9 +4,10 @@ package cn.palmte.work.bean; * @author xiongshiyan at 2021/11/1 , contact me with email yanshixiong@126.com or phone 15208384257 */ public enum ApproveStatusEnum { - APPROVAL_PENDING(0,"待审核"), - APPROVAL_PASSED(1,"审核通过"), - APPROVAL_UNPASS(2,"审核不通过"); + APPROVAL_UNCOMMIT(0,"草稿"), + APPROVAL_PENDING(1,"待审核"), + APPROVAL_PASSED(2,"审核通过"), + APPROVAL_UNPASS(3,"审核不通过"); private int approveStatus; private String approveStatusDesc; @@ -34,12 +35,15 @@ public enum ApproveStatusEnum { public static ApproveStatusEnum parseApproveStatus(int approveStatus){ if(approveStatus == 0){ - return APPROVAL_PENDING; + return APPROVAL_UNCOMMIT; } if(approveStatus == 1){ - return APPROVAL_PASSED; + return APPROVAL_PENDING; } if(approveStatus == 2){ + return APPROVAL_PASSED; + } + if(approveStatus == 3){ return APPROVAL_UNPASS; } throw new IllegalArgumentException("Unkown approveStatus:"+approveStatus); diff --git a/src/main/java/cn/palmte/work/bean/StatusEnum.java b/src/main/java/cn/palmte/work/bean/StatusEnum.java index 3b36678..c46d922 100644 --- a/src/main/java/cn/palmte/work/bean/StatusEnum.java +++ b/src/main/java/cn/palmte/work/bean/StatusEnum.java @@ -4,7 +4,6 @@ package cn.palmte.work.bean; * @author xiongshiyan at 2021/11/1 , contact me with email yanshixiong@126.com or phone 15208384257 */ public enum StatusEnum { - DRAFT(0,"草稿"), CREATED(1,"项目创建"), ESTIMATE_ACCOUNTS(5,"概算完成"), BUDGET_ACCOUNTS(10,"预算完成"), @@ -36,9 +35,6 @@ public enum StatusEnum { } public static StatusEnum parseStatus(int status){ - if(status == 0){ - return DRAFT; - } if(status == 1){ return CREATED; } 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 ea1557f..8a94a80 100644 --- a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java +++ b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java @@ -1,5 +1,6 @@ package cn.palmte.work.controller.backend; +import cn.palmte.work.bean.ApproveStatusEnum; import cn.palmte.work.bean.EstimateBean; import cn.palmte.work.model.Dept; import cn.palmte.work.model.DeptRepository; @@ -79,10 +80,24 @@ public class ProjectController extends BaseController{ return "admin/project_estimate_add"; } + + /** + * 预算保存草稿 + */ @RequestMapping("/estimateAddSave") public String estimateAddSave(Project project, EstimateBean estimateBean, Map model) { - projectService.estimateAddSave(project, estimateBean, InterfaceUtil.getAdmin()); + projectService.estimateAddSave(project, estimateBean, InterfaceUtil.getAdmin(), ApproveStatusEnum.APPROVAL_UNCOMMIT); + return "redirect:/project/list"; + } + + /** + * 预算保存并提交审核 + */ + @RequestMapping("/estimateAddSaveAndApprove") + public String estimateAddSaveAndApprove(Project project, EstimateBean estimateBean, + Map model) { + projectService.estimateAddSave(project, estimateBean, InterfaceUtil.getAdmin(), ApproveStatusEnum.APPROVAL_PENDING); return "redirect:/project/list"; } @RequestMapping("/edit") @@ -93,19 +108,21 @@ public class ProjectController extends BaseController{ model.put("estimateBean", estimateBean); return "admin/project_estimate_edit"; } + @RequestMapping("/estimateEditSave") public String estimateEditSave(Project project, EstimateBean estimateBean, Map model) { - projectService.estimateEditSave(project, estimateBean, InterfaceUtil.getAdmin()); + projectService.estimateEditSave(project, estimateBean, InterfaceUtil.getAdmin(), ApproveStatusEnum.APPROVAL_UNCOMMIT); + return "redirect:/project/list"; + } + @RequestMapping("/estimateEditSaveAndApprove") + public String estimateEditSaveAndApprove(Project project, EstimateBean estimateBean, + Map model) { + projectService.estimateEditSave(project, estimateBean, InterfaceUtil.getAdmin(), ApproveStatusEnum.APPROVAL_PENDING); return "redirect:/project/list"; } - @RequestMapping("/estimateSaveAndApprove") - public String estimateSaveAndApprove(Map model) { - 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/Project.java b/src/main/java/cn/palmte/work/model/Project.java index 8ea1ac4..2a88614 100644 --- a/src/main/java/cn/palmte/work/model/Project.java +++ b/src/main/java/cn/palmte/work/model/Project.java @@ -1,5 +1,6 @@ package cn.palmte.work.model; +import cn.palmte.work.bean.ApproveStatusEnum; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; @@ -13,6 +14,11 @@ import java.util.Date; @Entity @Table(name = "project") public class Project { + public static final int STATUS_CREATED = 1; + public static final int STATUS_ESTIMATE = 5; + public static final int STATUS_BUDGET = 10; + public static final int STATUS_SETTLE = 15; + public static final int STATUS_FINAL = 20; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @GenericGenerator(name = "persistenceGenerator", strategy = "increment") @@ -28,18 +34,23 @@ public class Project { @Column(name = "type_desc") private String typeDesc; /** - * 项目状态:0草稿,1项目创建,5概算完成,10预算完成,15结算中,20决算完成 + * 项目状态:1项目创建,5概算完成,10预算完成,15结算中,20决算完成 */ private int status; @Column(name = "status_desc") private String statusDesc; /** - * 审核状态:0待审核,1审核通过,2审核不通过 + * 概算、预算、结算、决算:审核状态:0草稿,1待审核,2审核通过,3审核不通过 */ - @Column(name = "approve_status") - private int approveStatus; - @Column(name = "approve_status_desc") - private String approveStatusDesc; + @Column(name = "approve_status_estimate") + private Integer approveStatusEstimate; + @Column(name = "approve_status_budget") + private Integer approveStatusBudget; + @Column(name = "approve_status_settle") + private Integer approveStatusSettle; + @Column(name = "approve_status_final") + private Integer approveStatusFinal; + /** * 审核人id */ @@ -178,20 +189,60 @@ public class Project { this.statusDesc = statusDesc; } - public int getApproveStatus() { - return approveStatus; + public Integer getApproveStatusEstimate() { + return approveStatusEstimate; } - public void setApproveStatus(int approveStatus) { - this.approveStatus = approveStatus; + public void setApproveStatusEstimate(Integer approveStatusEstimate) { + this.approveStatusEstimate = approveStatusEstimate; + } + + public Integer getApproveStatusBudget() { + return approveStatusBudget; + } + + public void setApproveStatusBudget(Integer approveStatusBudget) { + this.approveStatusBudget = approveStatusBudget; + } + + public Integer getApproveStatusSettle() { + return approveStatusSettle; + } + + public void setApproveStatusSettle(Integer approveStatusSettle) { + this.approveStatusSettle = approveStatusSettle; + } + + public Integer getApproveStatusFinal() { + return approveStatusFinal; + } + + public void setApproveStatusFinal(Integer approveStatusFinal) { + this.approveStatusFinal = approveStatusFinal; + } + + public Integer getApproveStatus() { + if(status == STATUS_CREATED || status == STATUS_ESTIMATE){ + return approveStatusEstimate; + } + if(status == STATUS_BUDGET){ + return approveStatusBudget; + } + if(status == STATUS_SETTLE){ + return approveStatusSettle; + } + if(status == STATUS_FINAL){ + return approveStatusFinal; + } + return null; } public String getApproveStatusDesc() { - return approveStatusDesc; - } - - public void setApproveStatusDesc(String approveStatusDesc) { - this.approveStatusDesc = approveStatusDesc; + Integer approveStatus = getApproveStatus(); + if(null == approveStatus){ + return "未知"; + } + return ApproveStatusEnum.parseApproveStatus(approveStatus).getApproveStatusDesc(); } public Integer getApproveId() { diff --git a/src/main/java/cn/palmte/work/service/ProjectService.java b/src/main/java/cn/palmte/work/service/ProjectService.java index ad0de33..05fdc54 100644 --- a/src/main/java/cn/palmte/work/service/ProjectService.java +++ b/src/main/java/cn/palmte/work/service/ProjectService.java @@ -46,7 +46,9 @@ public class ProjectService { queryHelper.addCondition("p.status=?", Integer.parseInt(searchInfo.get("status"))); } if(StrUtil.isNotEmpty(searchInfo.get("approveStatus")) && !"-1".equals(searchInfo.get("approveStatus"))){ - queryHelper.addCondition("p.approve_status=?", Integer.parseInt(searchInfo.get("approveStatus"))); + int approveStatus = Integer.parseInt(searchInfo.get("approveStatus")); + //四种状态满足其一即可 + queryHelper.addCondition("(p.approve_status_estimate=? OR p.approve_status_budget=? OR p.approve_status_settle=? OR p.approve_status_final=?)", approveStatus,approveStatus,approveStatus,approveStatus); } if(StrUtil.isNotEmpty(searchInfo.get("deptId")) && !"-1".equals(searchInfo.get("deptId"))){ queryHelper.addCondition("p.dept_id=?", Integer.parseInt(searchInfo.get("deptId"))); @@ -89,21 +91,20 @@ public class ProjectService { * 新增概算保存项目 */ @Transactional(rollbackFor = RuntimeException.class) - public Project estimateAddSave(Project project, EstimateBean estimateBean, Admin admin) { + public Project estimateAddSave(Project project, EstimateBean estimateBean, Admin admin, ApproveStatusEnum approveStatusEnum) { project.setTypeDesc(TypeEnum.parseType(project.getType()).getTypeDesc()); - project.setStatusDesc(StatusEnum.parseStatus(project.getStatus()).getStatusDesc()); - project.setApproveStatus(ApproveStatusEnum.APPROVAL_PENDING.getApproveStatus()); - project.setApproveStatusDesc(ApproveStatusEnum.APPROVAL_PENDING.getApproveStatusDesc()); + project.setStatus(StatusEnum.CREATED.getStatus()); + project.setStatusDesc(StatusEnum.CREATED.getStatusDesc()); + project.setApproveStatusEstimate(approveStatusEnum.getApproveStatus()); project.setCreatorId(admin.getId()); project.setCreatorName(admin.getUserName()); - //TODO 审核人通过计算得到 - project.setApproveId(0); + project.setApproveId(null); project.setApproveName(""); //TODO 获取登录人的部门信息 project.setDeptId(admin.getId()); - project.setDeptName(""); + project.setDeptName("工程部"); project.setCreateTime(new Date()); @@ -116,6 +117,7 @@ public class ProjectService { cost(project, estimateBean); //管理记录 costManage(project, estimateBean); + return project; } @@ -140,13 +142,13 @@ public class ProjectService { * 编辑概算保存项目 */ @Transactional(rollbackFor = RuntimeException.class) - public Project estimateEditSave(Project project, EstimateBean estimateBean, Admin admin) { + public Project estimateEditSave(Project project, EstimateBean estimateBean, Admin admin, ApproveStatusEnum approveStatusEnum) { //删除原来的 projectRepository.delete(project.getId()); //清空概算信息 clearEstimate(project); - return estimateAddSave(project, estimateBean, admin); + return estimateAddSave(project, estimateBean, admin, approveStatusEnum); } private void cost(Project project, EstimateBean estimateBean) { diff --git a/src/main/resources/static/assets/js/project_estimate.js b/src/main/resources/static/assets/js/project_estimate.js new file mode 100644 index 0000000..148baa6 --- /dev/null +++ b/src/main/resources/static/assets/js/project_estimate.js @@ -0,0 +1,192 @@ +function calIncomeAndCost() { + $("input[name='incomeDeviceTaxInclude']").change(function () { + calIncomeInclude(); + calIncomeCost(); + }); + $("input[name='incomeEngineerTaxInclude']").change(function () { + calIncomeInclude(); + calIncomeCost(); + }); + $("input[name='incomeServiceTaxInclude']").change(function () { + calIncomeInclude(); + calIncomeCost(); + }); + $("input[name='incomeDeviceTaxExclude']").change(function () { + calIncomeExclude(); + calIncomeCost(); + }); + $("input[name='incomeEngineerTaxExclude']").change(function () { + calIncomeExclude(); + calIncomeCost(); + }); + $("input[name='incomeServiceTaxExclude']").change(function () { + calIncomeExclude(); + calIncomeCost(); + }); + + + + + $("input[name='costPurchaseDeviceTaxInclude']").change(function () { + calCostInclude(); + calIncomeCost(); + }); + $("input[name='costPurchaseBuildTaxInclude']").change(function () { + calCostInclude(); + calIncomeCost(); + }); + $("input[name='costPurchaseServiceTaxInclude']").change(function () { + calCostInclude(); + calIncomeCost(); + }); + $("input[name='costPurchaseOtherTaxInclude']").change(function () { + calCostInclude(); + calIncomeCost(); + }); + $("input[name='costProjectManageTaxInclude']").change(function () { + calCostInclude(); + calIncomeCost(); + }); + $("input[name='costOtherOtherTaxInclude']").change(function () { + calCostInclude(); + calIncomeCost(); + }); + + $("input[name='costPurchaseDeviceTaxExclude']").change(function () { + calCostExclude(); + calIncomeCost(); + }); + $("input[name='costPurchaseBuildTaxExclude']").change(function () { + calCostExclude(); + calIncomeCost(); + }); + $("input[name='costPurchaseServiceTaxExclude']").change(function () { + calCostExclude(); + calIncomeCost(); + }); + $("input[name='costPurchaseOtherTaxExclude']").change(function () { + calCostExclude(); + calIncomeCost(); + }); + $("input[name='costProjectManageTaxExclude']").change(function () { + calCostExclude(); + calIncomeCost(); + }); + $("input[name='costOtherOtherTaxExclude']").change(function () { + calCostExclude(); + calIncomeCost(); + }); + + + $("input[name='costExpropriationTaxExclude']").change(function () { + calIncomeCost(); + }); + $("input[name='costCompanyManageTaxExclude']").change(function () { + calIncomeCost(); + }); +} + +/** + * 统计收入(含税),有一项没填就置空 + */ +function calIncomeInclude() { + var incomeDeviceTaxInclude = $("input[name='incomeDeviceTaxInclude']").val(); + var incomeEngineerTaxInclude = $("input[name='incomeEngineerTaxInclude']").val(); + var incomeServiceTaxInclude = $("input[name='incomeServiceTaxInclude']").val(); + + var incomeTotalTaxInclude = $("input[name='incomeTotalTaxInclude']"); + + if(incomeDeviceTaxInclude && incomeEngineerTaxInclude && incomeServiceTaxInclude){ + incomeTotalTaxInclude.val(parseFloat(incomeDeviceTaxInclude)+parseFloat(incomeEngineerTaxInclude)+parseFloat(incomeServiceTaxInclude)); + }else { + incomeTotalTaxInclude.val(""); + } +} +/** + * 统计收入(不含税),有一项没填就置空 + */ +function calIncomeExclude() { + var incomeDeviceTaxExclude = $("input[name='incomeDeviceTaxExclude']").val(); + var incomeEngineerTaxExclude = $("input[name='incomeEngineerTaxExclude']").val(); + var incomeServiceTaxExclude = $("input[name='incomeServiceTaxExclude']").val(); + + var incomeTotalTaxExclude = $("input[name='incomeTotalTaxExclude']"); + + if(incomeDeviceTaxExclude && incomeEngineerTaxExclude && incomeServiceTaxExclude){ + incomeTotalTaxExclude.val(parseFloat(incomeDeviceTaxExclude)+parseFloat(incomeEngineerTaxExclude)+parseFloat(incomeServiceTaxExclude)); + }else { + incomeTotalTaxExclude.val(""); + } +} + +/** + * 统计成本(含税),有一项没填就置空 + */ +function calCostInclude() { + var costPurchaseDeviceTaxInclude = $("input[name='costPurchaseDeviceTaxInclude']").val(); + var costPurchaseBuildTaxInclude = $("input[name='costPurchaseBuildTaxInclude']").val(); + var costPurchaseServiceTaxInclude = $("input[name='costPurchaseServiceTaxInclude']").val(); + var costPurchaseOtherTaxInclude = $("input[name='costPurchaseOtherTaxInclude']").val(); + var costProjectManageTaxInclude = $("input[name='costProjectManageTaxInclude']").val(); + var costOtherOtherTaxInclude = $("input[name='costOtherOtherTaxInclude']").val(); + + + var costTotalTaxInclude = $("input[name='costTotalTaxInclude']"); + + if(costPurchaseDeviceTaxInclude && costPurchaseBuildTaxInclude && costPurchaseServiceTaxInclude && costPurchaseOtherTaxInclude && costProjectManageTaxInclude && costOtherOtherTaxInclude){ + costTotalTaxInclude.val(parseFloat(costPurchaseDeviceTaxInclude)+parseFloat(costPurchaseBuildTaxInclude)+parseFloat(costPurchaseServiceTaxInclude)+parseFloat(costPurchaseOtherTaxInclude)+parseFloat(costProjectManageTaxInclude)+parseFloat(costOtherOtherTaxInclude)); + }else { + costTotalTaxInclude.val(""); + } +} +/** + * 统计成本(不含税),有一项没填就置空 + */ +function calCostExclude() { + var costPurchaseDeviceTaxExclude = $("input[name='costPurchaseDeviceTaxExclude']").val(); + var costPurchaseBuildTaxExclude = $("input[name='costPurchaseBuildTaxExclude']").val(); + var costPurchaseServiceTaxExclude = $("input[name='costPurchaseServiceTaxExclude']").val(); + var costPurchaseOtherTaxExclude = $("input[name='costPurchaseOtherTaxExclude']").val(); + var costProjectManageTaxExclude = $("input[name='costProjectManageTaxExclude']").val(); + var costOtherOtherTaxExclude = $("input[name='costOtherOtherTaxExclude']").val(); + + + var costTotalTaxExclude = $("input[name='costTotalTaxExclude']"); + + if(costPurchaseDeviceTaxExclude && costPurchaseBuildTaxExclude && costPurchaseServiceTaxExclude && costPurchaseOtherTaxExclude && costProjectManageTaxExclude && costOtherOtherTaxExclude){ + costTotalTaxExclude.val(parseFloat(costPurchaseDeviceTaxExclude)+parseFloat(costPurchaseBuildTaxExclude)+parseFloat(costPurchaseServiceTaxExclude)+parseFloat(costPurchaseOtherTaxExclude)+parseFloat(costProjectManageTaxExclude)+parseFloat(costOtherOtherTaxExclude)); + }else { + costTotalTaxExclude.val(""); + } +} + +/** + * 计算毛利、毛利率、贡献、贡献率 + */ +function calIncomeCost() { + var incomeTotalTaxExclude = $("input[name='incomeTotalTaxExclude']").val(); + var costTotalTaxExclude = $("input[name='costTotalTaxExclude']").val(); + var costExpropriationTaxExclude = $("input[name='costExpropriationTaxExclude']").val(); + var costCompanyManageTaxExclude = $("input[name='costCompanyManageTaxExclude']").val(); + + var projectGrossProfit = $("input[name='projectGrossProfit']"); + var projectGrossProfitRate = $("input[name='projectGrossProfitRate']"); + var projectContributionProfit = $("input[name='projectContributionProfit']"); + var projectContributionProfitRate = $("input[name='projectContributionProfitRate']"); + + if (incomeTotalTaxExclude && costTotalTaxExclude && costExpropriationTaxExclude) { + projectGrossProfit.val(parseFloat(incomeTotalTaxExclude) - parseFloat(costTotalTaxExclude) - parseFloat(costExpropriationTaxExclude)); + projectGrossProfitRate.val(parseFloat(projectGrossProfit.val()) * 100 / parseFloat(incomeTotalTaxExclude)); + } else { + projectGrossProfit.val(""); + projectGrossProfitRate.val(""); + } + + if (projectGrossProfit.val() && costCompanyManageTaxExclude) { + projectContributionProfit.val(parseFloat(projectGrossProfit.val()) - parseFloat(costCompanyManageTaxExclude)); + projectContributionProfitRate.val(parseFloat(projectContributionProfit.val()) * 100 / parseFloat(incomeTotalTaxExclude)) + } else { + projectContributionProfit.val(""); + projectContributionProfitRate.val(""); + } +} \ No newline at end of file diff --git a/src/main/resources/templates/admin/project_estimate_add.ftl b/src/main/resources/templates/admin/project_estimate_add.ftl index 5d5d5b1..47fb3b3 100644 --- a/src/main/resources/templates/admin/project_estimate_add.ftl +++ b/src/main/resources/templates/admin/project_estimate_add.ftl @@ -5,7 +5,7 @@
-
项目概算表 /
+
项目概算表
@@ -323,207 +323,27 @@
- - + +
- + diff --git a/src/main/resources/templates/admin/project_estimate_edit.ftl b/src/main/resources/templates/admin/project_estimate_edit.ftl index e6ee030..e1f75e1 100644 --- a/src/main/resources/templates/admin/project_estimate_edit.ftl +++ b/src/main/resources/templates/admin/project_estimate_edit.ftl @@ -323,207 +323,26 @@
- - + +
- + diff --git a/src/main/resources/templates/admin/project_list.ftl b/src/main/resources/templates/admin/project_list.ftl index c9fe9c8..369112f 100644 --- a/src/main/resources/templates/admin/project_list.ftl +++ b/src/main/resources/templates/admin/project_list.ftl @@ -64,7 +64,6 @@
- - - + + + +