diff --git a/src/main/java/cn/palmte/work/bean/CertaintyEnum.java b/src/main/java/cn/palmte/work/bean/CertaintyEnum.java index e810d6a..3540c4f 100644 --- a/src/main/java/cn/palmte/work/bean/CertaintyEnum.java +++ b/src/main/java/cn/palmte/work/bean/CertaintyEnum.java @@ -5,9 +5,9 @@ package cn.palmte.work.bean; */ public enum CertaintyEnum { PLAN_O(-1,""), - PLAN_A(1,"A:基本确定中标,待签合同,合同签订中"), - PLAN_B(2,"B:客户产品参数、商务评分、商务资质引导成功"), - PLAN_C(3,"C:项目初期引导阶段"); + PLAN_A(1,"A:项目成功率80%-100%"), + PLAN_B(2,"B:项目成功率60%-80%"), + PLAN_C(3,"C:项目成功率40%-60%"); private int certainty; private String certaintyStr; diff --git a/src/main/java/cn/palmte/work/bean/SignTypeEnum.java b/src/main/java/cn/palmte/work/bean/SignTypeEnum.java index 120b8a8..58c6dec 100644 --- a/src/main/java/cn/palmte/work/bean/SignTypeEnum.java +++ b/src/main/java/cn/palmte/work/bean/SignTypeEnum.java @@ -5,7 +5,8 @@ package cn.palmte.work.bean; */ public enum SignTypeEnum { PLAN_O(-1,""), - PLAN_A(1,"紫光汇智直接投标"); + PLAN_A(1,"是"), + PLAN_B(2,"否"); private int signType; private String signTypeStr; @@ -35,6 +36,9 @@ public enum SignTypeEnum { if(signType == 1){ return PLAN_A; } + if(signType == 2){ + return PLAN_B; + } return PLAN_O; } } diff --git a/src/main/java/cn/palmte/work/controller/backend/MonthlySettleController.java b/src/main/java/cn/palmte/work/controller/backend/MonthlySettleController.java index da175f1..ecba5a6 100644 --- a/src/main/java/cn/palmte/work/controller/backend/MonthlySettleController.java +++ b/src/main/java/cn/palmte/work/controller/backend/MonthlySettleController.java @@ -86,7 +86,7 @@ public class MonthlySettleController extends BaseController { @RequestMapping("/export") public void export(@RequestParam(value = "keywords", required = false) String keywords, HttpServletResponse httpServletResponse) throws IOException { Map searchInfo = getSearchInfo(keywords); - downloadHeader(httpServletResponse, Utils.generateExcelName("月度结算表"), "application/octet-stream"); + downloadHeader(httpServletResponse, Utils.generateExcelName("PMO项目执行进度管理"), "application/octet-stream"); String[] headers = {"项目编号", "项目名称", "项目类型", "合同编号", "合同方", "合同金额", "合同签订时间", "最终业主", "累计已收款", "已采购累计付款", "已采购累计未付款", "超期垫资金额", "销售累计开票金额", "销售经理", "项目经理", "收款节点", "收款要求时间", "收款金额", "实际收款时间", "实际收款金额", "实际欠收金额", "到货证明", "项目风险预警", "已计收金额", "未计收金额", "超期天数", "验收报告时间"}; String[] exportColumns = {"projectNo", "projectName", "projectType", "contractNo", "contractParty", "contractAmountRound", "contractSignTimeStr", "owner", "totalCollectRound", @@ -98,7 +98,7 @@ public class MonthlySettleController extends BaseController { @RequestMapping("/exportSingle") public void exportSingle(@RequestParam String id, @RequestParam String time, @RequestParam String projectName, HttpServletResponse httpServletResponse) throws IOException { - downloadHeader(httpServletResponse, Utils.generateExcelName("月度结算表明细"), "application/octet-stream"); + downloadHeader(httpServletResponse, Utils.generateExcelName("PMO项目执行进度管理明细"), "application/octet-stream"); String[] headers = {"月份", "项目编号", "项目名称", "项目类型", "合同编号", "合同方", "合同金额", "合同签订时间", "最终业主", "累计已收款", "已采购累计付款", "已采购累计未付款", "超期垫资金额", "销售累计开票金额", "销售经理", "项目经理", "收款节点", "收款要求时间", "收款金额", "实际收款时间", "实际收款金额", "实际欠收金额", "超期天数", "到货证明", "验收报告时间", "项目风险预警", "已计收金额", "未计收金额"}; String[] exportColumns = {"month", "projectNo", "projectName", "projectType", "contractNo", "contractParty", "contractAmountRound", "contractSignTimeStr", "owner", "totalCollectRound", @@ -115,7 +115,7 @@ public class MonthlySettleController extends BaseController { public void template(HttpServletResponse response) throws Exception { String[] headers = new String[]{"项目编号", "最终业主", "合同方", "项目名称", "合同金额", "累计已收款", "已采购累计付款", "已采购累计未付款", "超期垫资金额", "销售累计开票金额", "合同编号", "项目类型", "合同签订时间", "销售经理", "项目经理", "收款节点", "收款要求时间", "收款金额", "实际收款时间", "实际收款金额", "实际欠收金额", "超期天数", "到货证明", "验收报告时间", "项目风险预警", "已计收金额", "未计收金额"}; - downloadHeader(response, Utils.generateExcelName("月度结算表导入模板")); + downloadHeader(response, Utils.generateExcelName("PMO项目执行进度管理导入模板")); ExportUtils exportUtils = new ExportUtils(headers); exportUtils.write(response.getOutputStream()); } 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 998152f..033e827 100644 --- a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java +++ b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java @@ -28,6 +28,7 @@ import top.jfunc.common.utils.CollectionUtil; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -128,7 +129,7 @@ public class ProjectController extends BaseController { Map searchInfo = getSearchInfo(keywords); downloadHeader(httpServletResponse, Utils.generateExcelName("项目报表"), "application/octet-stream"); String[] headers = {"项目编号", "项目名称", "项目类型", "垫资模式", "垫资利息", "垫资峰值", "项目合同金额", "项目毛利", "项目毛利率", "项目把握度", "汇智产品金额", "华智产品金额", - "华三产品金额", "其他产品金额", "项目状态", "行业场景应用", "解决方案", "客户名称", "终端客户名称", "预计合同签订时间", "项目计划招标时间", "是否二次合作", "签单方式", "战略合作对象", + "华三产品金额", "其他产品金额", "项目状态", "行业场景应用", "解决方案", "客户名称", "最终用户名称", "预计合同签订时间", "项目计划招标时间", "是否二次合作", "直签", "战略合作对象", "项目负责人", "价值及风险", "主合同收款条款", "主合同具体解决方案", "计收计划", "审核状态", "当前审核人", "项目创建者", "部门名称", "项目开始时间", "项目结束时间", "最后更新时间"}; String[] exportColumns = {"projectNo", "name", "typeDesc", "underwrittenModeStr", "advanceInterestAmountRound", "advancePeakAmountRound", "contractRound", "grossProfitRound", "grossProfitMarginRound", "certaintyStr", "huizhiRound", "huazhiRound", "huasanRound", "ziguangRound", "statusDesc", "industryScenario", "resolvePlan", "customer", "terminalCustomer", "contractTime", "bidsTime", "isSecondStr", "signTypeStr", "collaborator", @@ -148,12 +149,12 @@ public class ProjectController extends BaseController { response.setHeader("Content-Type", "application/vnd.ms-excel"); ServletOutputStream outputStream = response.getOutputStream(); ExportExcelUtils exportExcelUtils = new ExportExcelUtils(); - String[] headers0 = {"部门名称", "项目编号", "项目名称", "项目类型", "项目计划开始时间", "项目计划结束时间", "垫资模式", "合作对象", "垫资利息", "垫资峰值", "合同金额", "项目毛利", "项目毛利率", "华智产品金额", "汇智产品金额", "华三产品金额", "其他产品金额", "项目把握度", "行业场景应用", "项目解决方案", "客户名称", "终端客户名称", "价值及风险"}; + String[] headers0 = {"部门名称", "项目编号", "项目名称", "项目类型", "项目计划开始时间", "项目计划结束时间", "垫资模式", "合作对象", "垫资利息", "垫资峰值", "合同金额", "项目毛利", "项目毛利率", "华智产品金额", "汇智产品金额", "华三产品金额", "其他产品金额", "项目把握度", "行业场景应用", "项目解决方案", "客户名称", "最终用户名称", "价值及风险"}; String[] columns0 = {"deptName", "projectNo", "name", "typeDesc", "startDate", "endDate", "underwrittenModeStr", "collaborator", "advanceInterestAmountRound", "advancePeakAmountRound", "contractRound", "grossProfitRound", "grossProfitMarginRound", "huazhiRound", "huizhiRound", "huasanRound", "ziguangRound", "certaintyStr", "industryScenario", "resolvePlanStr", "customer", "terminalCustomer", "valueRisk"}; - exportExcelUtils.exportProjectExcel(headers0, columns0, project, "yyyy-MM-dd", 0, "项目基本信息", outputStream); - String[] headers1 = {"项目负责人", "预计合同签订时间", "项目计划招标时间", "是否二次合作", "签单方式", "主合同收款条款", "主合同具体解决方案", "计收计划"}; + exportExcelUtils.exportProjectExcel(headers0, columns0, project, "yyyy-MM-dd", 0, "项目立项(概算)基本信息", outputStream); + String[] headers1 = {"项目负责人", "预计合同签订时间", "项目计划招标时间", "是否二次合作", "直签", "主合同收款条款", "主合同具体解决方案", "计收计划"}; String[] columns1 = {"principal", "contractTime", "bidsTime", "isSecondStr", "signTypeStr", "mainContractCollectionTerms", "mainContractResolvePlan", "calculationCollection"}; - exportExcelUtils.exportProjectExcel(headers1, columns1, project, "yyyy-MM-dd", 0, "项目其他信息", outputStream); + exportExcelUtils.exportProjectExcel(headers1, columns1, project, "yyyy-MM-dd", 0, "项目立项(概算)其他信息", outputStream); BudgetBean budgetBean = projectBudgetService.getBudget(project); if (project.getStatus() < 5) { exportExcelUtils.end(outputStream); @@ -179,9 +180,17 @@ public class ProjectController extends BaseController { String[] headers2 = {"序号", "类别", "名称", "单位", "数量", "单价", "税率(%)", "含税总金额(元)", "不含税金额(元)", "税金(元)"}; String[] columns2 = {"tempId", "type", "name", "unit", "amount", "price", "taxRate", "totalTaxInclude", "totalTaxExclude", "totalTax"}; exportExcelUtils.exportIncomeDetailExcel(headers2, columns2, project, budgetBean, budgetIncomeDetail, incomeTotalAmount, "yyyy-MM-dd", 0, "收入明细表", outputStream); + //收入计划 + List budgetIncomePlanDetail = projectBudgetService.getBudgetIncomePlanDetail(project); + BigDecimal incomePlanTotalReceiveAmount = projectBudgetService.getBudgetIncomePlanReceiveAmount(project); + String[] headers6 = {"序号", "收款节点", "收款时间", "收款金额(元)"}; + String[] columns6 = {"tempId", "receivePoint", "receiveTime", "receiveAmount"}; + exportExcelUtils.exportIncomePlanDetailExcel(headers6, columns6, project, budgetBean, budgetIncomePlanDetail, incomePlanTotalReceiveAmount, "yyyy-MM-dd", 0, "收入计划表", outputStream); //成本明细 List budgetCostDetail = projectBudgetService.getBudgetCostDetail(project); Integer costTotalAmount = projectBudgetService.getBudgetCostAmount(project); + BigDecimal costUnderwrittenAmountTotal = projectBudgetService.getBudgetCostUnderwrittenAmountTotal(project); + BigDecimal costPayAmountTotal = projectBudgetService.getBudgetCostPayAmountTotal(project); List procurementTypes = procurementTypeService.allProcurementTypeList(); Map procurementMap = procurementTypes.stream().collect(Collectors.toMap(ProcurementType::getId, ProcurementType::getName)); Set rates2 = new HashSet<>(); @@ -198,15 +207,16 @@ public class ProjectController extends BaseController { } else { costTaxRates = costTaxSb.toString(); } - String[] headers3 = {"序号", "大类", "类别", "名称", "单位", "数量", "单价", "税率(%)", "含税总金额(元)", "不含税金额(元)", "税金(元)"}; - String[] columns3 = {"tempId", "type", "category", "name", "unit", "amount", "price", "taxRate", "totalTaxInclude", "totalTaxExclude", "totalTax"}; - exportExcelUtils.exportCostDetailExcel(headers3, columns3, project, budgetBean, budgetCostDetail, costTotalAmount, procurementMap, "yyyy-MM-dd", 0, "采购成本明细表", outputStream); + String[] headers3 = {"序号", "大类", "类别", "名称", "单位", "数量", "单价", "税率(%)", "含税总金额(元)", "不含税金额(元)", "税金(元)", "签约方", "是否垫资", "预估垫资金额(元)", "支出时间", "支出金额(元)", "付款方式", "备注"}; + String[] columns3 = {"tempId", "type", "category", "name", "unit", "amount", "price", "taxRate", "totalTaxInclude", "totalTaxExclude", "totalTax", "contractParty", "isUnderwritten", "underwrittenAmount", "payTime", "payAmount", "payWay", "remark"}; + exportExcelUtils.exportCostDetailExcel(headers3, columns3, project, budgetBean, budgetCostDetail, costTotalAmount, costUnderwrittenAmountTotal, costPayAmountTotal, procurementMap, "yyyy-MM-dd", 0, "采购成本明细表", outputStream); //项目管理成本明细 List budgetCostProjectManageDetail = projectBudgetService.getBudgetCostProjectManageDetail(project); Integer costProjectManageTotalAmount = projectBudgetService.getBudgetCostProjectManageAmount(project); - String[] headers4 = {"序号", "财务费用类别", "业务项目", "项目明细", "单位", "数量", "单价", "总金额(元)", "预估计算方法", "预估依据", "备注"}; - String[] columns4 = {"tempId", "type", "name", "detail", "unit", "amount", "price", "total", "predictMethod", "predictWhy", "remark"}; - exportExcelUtils.exportCostManageDetailExcel(headers4, columns4, project, budgetBean, budgetCostProjectManageDetail, costProjectManageTotalAmount, "yyyy-MM-dd", 0, "项目管理成本表", outputStream); + BigDecimal managePayAmountTotal = projectBudgetService.getBudgetCostProjectManagePayAmount(project); + String[] headers4 = {"序号", "财务费用类别", "业务项目", "项目明细", "单位", "数量", "单价", "总金额(元)", "支出时间", "支出金额(元)", "预估计算方法", "预估依据", "备注"}; + String[] columns4 = {"tempId", "type", "name", "detail", "unit", "amount", "price", "total", "payTime", "payAmount", "predictMethod", "predictWhy", "remark"}; + exportExcelUtils.exportCostManageDetailExcel(headers4, columns4, project, budgetBean, budgetCostProjectManageDetail, costProjectManageTotalAmount, managePayAmountTotal, "yyyy-MM-dd", 0, "项目管理成本表", outputStream); //资金计划明细 // ProjectBudgetPlanDetail projectBudgetPlanDetailTotalTitle = projectBudgetService.getProjectBudgetPlanDetailTotalTitle(project, // budgetIncomeDetail, @@ -338,6 +348,11 @@ public class ProjectController extends BaseController { } model.put("incomeDetails", budgetIncomeDetail); model.put("incomeTotalAmount", projectBudgetService.getBudgetIncomeAmount(project)); + //收入计划 + List budgetIncomePlanDetail = projectBudgetService.getBudgetIncomePlanDetail(project); + model.put("incomePlanDetails", budgetIncomePlanDetail); + BigDecimal incomePlanTotalReceiveAmount = projectBudgetService.getBudgetIncomePlanReceiveAmount(project); + model.put("incomePlanTotal", incomePlanTotalReceiveAmount); //成本明细 List budgetCostDetail = projectBudgetService.getBudgetCostDetail(project); Set rates2 = new HashSet<>(); @@ -355,10 +370,13 @@ public class ProjectController extends BaseController { } model.put("costDetails", budgetCostDetail); model.put("costTotalAmount", projectBudgetService.getBudgetCostAmount(project)); + model.put("costUnderwrittenAmountTotal", projectBudgetService.getBudgetCostUnderwrittenAmountTotal(project)); + model.put("costPayAmountTotal", projectBudgetService.getBudgetCostPayAmountTotal(project)); //项目管理成本明细 List budgetCostProjectManageDetail = projectBudgetService.getBudgetCostProjectManageDetail(project); model.put("costProjectManageDetails", budgetCostProjectManageDetail); model.put("costProjectManageTotalAmount", projectBudgetService.getBudgetCostProjectManageAmount(project)); + model.put("managePayAmountTotal", projectBudgetService.getBudgetCostProjectManagePayAmount(project)); List projectBudgetPlanDetails = projectBudgetService.getProjectBudgetPlanDetails(project); //资金计划明细 model.put("projectBudgetPlanDetails", projectBudgetPlanDetails); @@ -420,6 +438,27 @@ public class ProjectController extends BaseController { return ResponseMsg.buildSuccessMsg("成功"); } + /** + * 保存收入计划 + */ + @RequestMapping("/budgetEditSaveIncomePlanDetail") + @ResponseBody + public ResponseMsg budgetEditSaveIncomePlanDetail(@RequestBody String body) { + JSONObject jsonObject = JSON.parseObject(body); + JSONArray details = jsonObject.getJSONArray(DETAILS); + List detailList = new ArrayList<>(details.size()); + for (int i = 0; i < details.size(); i++) { + ProjectBudgetIncomePlanDetailTemp detail = details.getObject(i, ProjectBudgetIncomePlanDetailTemp.class); + detailList.add(detail); + } + + Project project = projectService.getProject(jsonObject.getInteger(PROJECT_ID)); + + projectBudgetService.saveBudgetIncomePlanDetailTemp(project, detailList); + + return ResponseMsg.buildSuccessMsg("成功"); + } + /** * 保存成本明细 */ @@ -468,6 +507,8 @@ public class ProjectController extends BaseController { detail.setName("商务及专项验收费用"); } else if ("7".equals(detail.getName1())) { detail.setName("办公费用"); + } else if ("9".equals(detail.getName1())) { + detail.setName("保证金"); } detail.setIsDiy(0); } @@ -553,7 +594,7 @@ public class ProjectController extends BaseController { Map searchInfo = getSearchInfo(keywords); downloadHeader(httpServletResponse, Utils.generateExcelName("待我审核项目报表"), "application/octet-stream"); String[] headers = {"项目编号", "项目名称", "项目类型", "垫资模式", "垫资利息", "垫资峰值", "项目合同金额", "项目毛利", "项目毛利率", "项目把握度", "汇智产品金额", "华智产品金额", - "华三产品金额", "其他产品金额", "项目状态", "行业场景应用", "解决方案", "客户名称", "终端客户名称", "预计合同签订时间", "项目计划招标时间", "是否二次合作", "签单方式", "战略合作对象", + "华三产品金额", "其他产品金额", "项目状态", "行业场景应用", "解决方案", "客户名称", "最终用户名称", "预计合同签订时间", "项目计划招标时间", "是否二次合作", "直签", "战略合作对象", "项目负责人", "价值及风险", "主合同收款条款", "主合同具体解决方案", "计收计划", "审核状态", "当前审核人", "项目创建者", "部门名称", "项目开始时间", "项目结束时间", "最后更新时间"}; String[] exportColumns = {"projectNo", "name", "typeDesc", "underwrittenModeStr", "advanceInterestAmountRound", "advancePeakAmountRound", "contractRound", "grossProfitRound", "grossProfitMarginRound", "certaintyStr", "huizhiRound", "huazhiRound", "huasanRound", "ziguangRound", "statusDesc", "industryScenario", "resolvePlan", "customer", "terminalCustomer", "contractTime", "bidsTime", "isSecondStr", "signTypeStr", "collaborator", @@ -594,13 +635,22 @@ public class ProjectController extends BaseController { List budgetIncomeDetail = projectBudgetService.getBudgetIncomeDetail(project); model.put("incomeDetails", budgetIncomeDetail); model.put("incomeTotalAmount", projectBudgetService.getBudgetIncomeAmount(project)); + //收入计划 + List budgetIncomePlanDetail = projectBudgetService.getBudgetIncomePlanDetail(project); + model.put("incomePlanDetails", budgetIncomePlanDetail); + BigDecimal incomePlanTotalReceiveAmount = projectBudgetService.getBudgetIncomePlanReceiveAmount(project); + model.put("incomePlanTotal", incomePlanTotalReceiveAmount); //成本明细 List budgetCostDetail = projectBudgetService.getBudgetCostDetail(project); model.put("costDetails", budgetCostDetail); model.put("costTotalAmount", projectBudgetService.getBudgetCostAmount(project)); + model.put("costUnderwrittenAmountTotal", projectBudgetService.getBudgetCostUnderwrittenAmountTotal(project)); + model.put("costPayAmountTotal", projectBudgetService.getBudgetCostPayAmountTotal(project)); //项目管理成本明细 - model.put("costProjectManageDetails", projectBudgetService.getBudgetCostProjectManageDetail(project)); + List budgetCostProjectManageDetail = projectBudgetService.getBudgetCostProjectManageDetail(project); + model.put("costProjectManageDetails", budgetCostProjectManageDetail); model.put("costProjectManageTotalAmount", projectBudgetService.getBudgetCostProjectManageAmount(project)); + model.put("managePayAmountTotal", projectBudgetService.getBudgetCostProjectManagePayAmount(project)); List projectBudgetPlanDetails = projectBudgetService.getProjectBudgetPlanDetails(project); //资金计划明细 model.put("projectBudgetPlanDetails", projectBudgetPlanDetails); diff --git a/src/main/java/cn/palmte/work/model/Project.java b/src/main/java/cn/palmte/work/model/Project.java index 5c1cf7c..677834c 100644 --- a/src/main/java/cn/palmte/work/model/Project.java +++ b/src/main/java/cn/palmte/work/model/Project.java @@ -114,7 +114,7 @@ public class Project { @Column(name = "customer") private String customer; /** - * 终端客户名称 + * 最终用户名称 */ @Column(name = "terminal_customer") private String terminalCustomer; diff --git a/src/main/java/cn/palmte/work/model/ProjectBudgetCostDetailBase.java b/src/main/java/cn/palmte/work/model/ProjectBudgetCostDetailBase.java index d537f81..0d9f47a 100644 --- a/src/main/java/cn/palmte/work/model/ProjectBudgetCostDetailBase.java +++ b/src/main/java/cn/palmte/work/model/ProjectBudgetCostDetailBase.java @@ -4,6 +4,7 @@ import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; import java.math.BigDecimal; +import java.util.Date; @MappedSuperclass public class ProjectBudgetCostDetailBase { @@ -35,6 +36,28 @@ public class ProjectBudgetCostDetailBase { @Column(name = "tax_rate") private BigDecimal taxRate; + @Column(name = "contract_party") + private String contractParty; + + @Column(name = "is_underwritten") + private int isUnderwritten; + + @Column(name = "underwritten_amount") + private BigDecimal underwrittenAmount; + + @Column(name = "pay_time") + @Temporal(TemporalType.TIMESTAMP) + private Date payTime; + + @Column(name = "pay_amount") + private BigDecimal payAmount; + + @Column(name = "pay_way") + private String payWay; + + @Column(name = "remark") + private String remark; + public Integer getId() { return id; } @@ -107,6 +130,62 @@ public class ProjectBudgetCostDetailBase { this.taxRate = taxRate; } + public String getContractParty() { + return contractParty; + } + + public void setContractParty(String contractParty) { + this.contractParty = contractParty; + } + + public int getIsUnderwritten() { + return isUnderwritten; + } + + public void setIsUnderwritten(int isUnderwritten) { + this.isUnderwritten = isUnderwritten; + } + + public BigDecimal getUnderwrittenAmount() { + return underwrittenAmount; + } + + public void setUnderwrittenAmount(BigDecimal underwrittenAmount) { + this.underwrittenAmount = underwrittenAmount; + } + + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + public BigDecimal getPayAmount() { + return payAmount; + } + + public void setPayAmount(BigDecimal payAmount) { + this.payAmount = payAmount; + } + + public String getPayWay() { + return payWay; + } + + public void setPayWay(String payWay) { + this.payWay = payWay; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + public BigDecimal getTotalTaxInclude(){ if(null == price){ return null; diff --git a/src/main/java/cn/palmte/work/model/ProjectBudgetCostDetailRepository.java b/src/main/java/cn/palmte/work/model/ProjectBudgetCostDetailRepository.java index 88260ff..9e02d9f 100644 --- a/src/main/java/cn/palmte/work/model/ProjectBudgetCostDetailRepository.java +++ b/src/main/java/cn/palmte/work/model/ProjectBudgetCostDetailRepository.java @@ -3,10 +3,18 @@ package cn.palmte.work.model; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import java.math.BigDecimal; import java.util.List; public interface ProjectBudgetCostDetailRepository extends JpaRepository { List findAllByProjectIdEquals(int id); @Query(value = "select sum(amount) from project_budget_cost_detail where project_id = ?1", nativeQuery = true) - Integer findAmountByProject(int projectId);} + Integer findAmountByProject(int projectId); + + @Query(value = "select sum(pay_amount) from project_budget_cost_detail where project_id = ?1", nativeQuery = true) + BigDecimal findPayAmountByProject(int id); + + @Query(value = "select sum(underwritten_amount) from project_budget_cost_detail where project_id = ?1", nativeQuery = true) + BigDecimal findUnderwrittenAmountByProject(int id); +} diff --git a/src/main/java/cn/palmte/work/model/ProjectBudgetCostDetailTemp.java b/src/main/java/cn/palmte/work/model/ProjectBudgetCostDetailTemp.java index 57eee88..d189e59 100644 --- a/src/main/java/cn/palmte/work/model/ProjectBudgetCostDetailTemp.java +++ b/src/main/java/cn/palmte/work/model/ProjectBudgetCostDetailTemp.java @@ -20,6 +20,13 @@ public class ProjectBudgetCostDetailTemp extends ProjectBudgetCostDetailBase{ detail.setAmount(getAmount()); detail.setPrice(getPrice()); detail.setTaxRate(getTaxRate()); + detail.setContractParty(getContractParty()); + detail.setIsUnderwritten(getIsUnderwritten()); + detail.setUnderwrittenAmount(getUnderwrittenAmount()); + detail.setPayTime(getPayTime()); + detail.setPayAmount(getPayAmount()); + detail.setPayWay(getPayWay()); + detail.setRemark(getRemark()); return detail; } } \ No newline at end of file diff --git a/src/main/java/cn/palmte/work/model/ProjectBudgetCostProjectManageDetailBase.java b/src/main/java/cn/palmte/work/model/ProjectBudgetCostProjectManageDetailBase.java index 439093a..dc91ba5 100644 --- a/src/main/java/cn/palmte/work/model/ProjectBudgetCostProjectManageDetailBase.java +++ b/src/main/java/cn/palmte/work/model/ProjectBudgetCostProjectManageDetailBase.java @@ -4,6 +4,7 @@ import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; import java.math.BigDecimal; +import java.util.Date; @MappedSuperclass public class ProjectBudgetCostProjectManageDetailBase { @@ -31,6 +32,13 @@ public class ProjectBudgetCostProjectManageDetailBase { private int amount; private BigDecimal price; + @Column(name = "pay_time") + @Temporal(TemporalType.TIMESTAMP) + private Date payTime; + + @Column(name = "pay_amount") + private BigDecimal payAmount; + @Column(name = "predict_method") private String predictMethod; @Column(name = "predict_why") @@ -104,6 +112,22 @@ public class ProjectBudgetCostProjectManageDetailBase { this.price = price; } + public Date getPayTime() { + return payTime; + } + + public void setPayTime(Date payTime) { + this.payTime = payTime; + } + + public BigDecimal getPayAmount() { + return payAmount; + } + + public void setPayAmount(BigDecimal payAmount) { + this.payAmount = payAmount; + } + public String getDetail() { return detail; } diff --git a/src/main/java/cn/palmte/work/model/ProjectBudgetCostProjectManageDetailRepository.java b/src/main/java/cn/palmte/work/model/ProjectBudgetCostProjectManageDetailRepository.java index 1c1e28f..078ab44 100644 --- a/src/main/java/cn/palmte/work/model/ProjectBudgetCostProjectManageDetailRepository.java +++ b/src/main/java/cn/palmte/work/model/ProjectBudgetCostProjectManageDetailRepository.java @@ -3,6 +3,7 @@ package cn.palmte.work.model; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import java.math.BigDecimal; import java.util.List; public interface ProjectBudgetCostProjectManageDetailRepository extends JpaRepository { @@ -10,4 +11,7 @@ public interface ProjectBudgetCostProjectManageDetailRepository extends JpaRepos @Query(value = "select sum(amount) from project_budget_cost_project_manage_detail where project_id = ?1", nativeQuery = true) Integer findAmountByProject(int id); + + @Query(value = "select sum(pay_amount) from project_budget_cost_project_manage_detail where project_id = ?1", nativeQuery = true) + BigDecimal findPayAmountByProject(int id); } diff --git a/src/main/java/cn/palmte/work/model/ProjectBudgetCostProjectManageDetailTemp.java b/src/main/java/cn/palmte/work/model/ProjectBudgetCostProjectManageDetailTemp.java index e051244..aa52871 100644 --- a/src/main/java/cn/palmte/work/model/ProjectBudgetCostProjectManageDetailTemp.java +++ b/src/main/java/cn/palmte/work/model/ProjectBudgetCostProjectManageDetailTemp.java @@ -20,6 +20,8 @@ public class ProjectBudgetCostProjectManageDetailTemp extends ProjectBudgetCostP detail.setUnit(getUnit()); detail.setAmount(getAmount()); detail.setPrice(getPrice()); + detail.setPayTime(getPayTime()); + detail.setPayAmount(getPayAmount()); detail.setPredictMethod(getPredictMethod()); detail.setPredictWhy(getPredictWhy()); detail.setRemark(getRemark()); diff --git a/src/main/java/cn/palmte/work/model/ProjectBudgetIncomePlanDetail.java b/src/main/java/cn/palmte/work/model/ProjectBudgetIncomePlanDetail.java new file mode 100644 index 0000000..8a23619 --- /dev/null +++ b/src/main/java/cn/palmte/work/model/ProjectBudgetIncomePlanDetail.java @@ -0,0 +1,12 @@ +package cn.palmte.work.model; + +import javax.persistence.Entity; +import javax.persistence.Table; + +/** + * 项目预算收入明细表 + */ +@Entity +@Table(name = "project_budget_income_plan_detail") +public class ProjectBudgetIncomePlanDetail extends ProjectBudgetIncomePlanDetailBase{ +} \ No newline at end of file diff --git a/src/main/java/cn/palmte/work/model/ProjectBudgetIncomePlanDetailBase.java b/src/main/java/cn/palmte/work/model/ProjectBudgetIncomePlanDetailBase.java new file mode 100644 index 0000000..494b544 --- /dev/null +++ b/src/main/java/cn/palmte/work/model/ProjectBudgetIncomePlanDetailBase.java @@ -0,0 +1,72 @@ +package cn.palmte.work.model; + +import org.hibernate.annotations.GenericGenerator; + +import javax.persistence.*; +import java.math.BigDecimal; +import java.util.Date; + +@MappedSuperclass +public class ProjectBudgetIncomePlanDetailBase { + + /** + * id + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @GenericGenerator(name = "persistenceGenerator", strategy = "increment") + private Integer id; + + @Column(name = "project_id") + private int projectId; + + @Column(name = "receive_point") + private String receivePoint; + + @Column(name = "receive_time") + @Temporal(TemporalType.TIMESTAMP) + private Date receiveTime; + + @Column(name = "receive_amount") + private BigDecimal receiveAmount; + + 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 String getReceivePoint() { + return receivePoint; + } + + public void setReceivePoint(String receivePoint) { + this.receivePoint = receivePoint; + } + + public Date getReceiveTime() { + return receiveTime; + } + + public void setReceiveTime(Date receiveTime) { + this.receiveTime = receiveTime; + } + + public BigDecimal getReceiveAmount() { + return receiveAmount; + } + + public void setReceiveAmount(BigDecimal receiveAmount) { + this.receiveAmount = receiveAmount; + } +} \ No newline at end of file diff --git a/src/main/java/cn/palmte/work/model/ProjectBudgetIncomePlanDetailRepository.java b/src/main/java/cn/palmte/work/model/ProjectBudgetIncomePlanDetailRepository.java new file mode 100644 index 0000000..61a2a4f --- /dev/null +++ b/src/main/java/cn/palmte/work/model/ProjectBudgetIncomePlanDetailRepository.java @@ -0,0 +1,14 @@ +package cn.palmte.work.model; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.math.BigDecimal; +import java.util.List; + +public interface ProjectBudgetIncomePlanDetailRepository extends JpaRepository { + List findAllByProjectIdEquals(int id); + + @Query(value = "select sum(receive_amount) from project_budget_income_plan_detail where project_id = ?1", nativeQuery = true) + BigDecimal findReceiveAmountByProject(int projectId); +} diff --git a/src/main/java/cn/palmte/work/model/ProjectBudgetIncomePlanDetailTemp.java b/src/main/java/cn/palmte/work/model/ProjectBudgetIncomePlanDetailTemp.java new file mode 100644 index 0000000..4b47ae9 --- /dev/null +++ b/src/main/java/cn/palmte/work/model/ProjectBudgetIncomePlanDetailTemp.java @@ -0,0 +1,20 @@ +package cn.palmte.work.model; + +import javax.persistence.Entity; +import javax.persistence.Table; + +/** + * 项目预算收入明细表 + */ +@Entity +@Table(name = "project_budget_income_plan_detail_temp") +public class ProjectBudgetIncomePlanDetailTemp extends ProjectBudgetIncomePlanDetailBase{ + public ProjectBudgetIncomePlanDetail toProjectBudgetIncomePlanDetail(){ + ProjectBudgetIncomePlanDetail projectBudgetIncomePlanDetail = new ProjectBudgetIncomePlanDetail(); + projectBudgetIncomePlanDetail.setProjectId(getProjectId()); + projectBudgetIncomePlanDetail.setReceivePoint(getReceivePoint()); + projectBudgetIncomePlanDetail.setReceiveTime(getReceiveTime()); + projectBudgetIncomePlanDetail.setReceiveAmount(getReceiveAmount()); + return projectBudgetIncomePlanDetail; + } +} \ No newline at end of file diff --git a/src/main/java/cn/palmte/work/model/ProjectBudgetIncomePlanDetailTempRepository.java b/src/main/java/cn/palmte/work/model/ProjectBudgetIncomePlanDetailTempRepository.java new file mode 100644 index 0000000..c7888f7 --- /dev/null +++ b/src/main/java/cn/palmte/work/model/ProjectBudgetIncomePlanDetailTempRepository.java @@ -0,0 +1,9 @@ +package cn.palmte.work.model; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ProjectBudgetIncomePlanDetailTempRepository 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 1b02e85..4e5adc3 100644 --- a/src/main/java/cn/palmte/work/service/ProjectBudgetService.java +++ b/src/main/java/cn/palmte/work/service/ProjectBudgetService.java @@ -30,6 +30,10 @@ public class ProjectBudgetService { @Autowired private ProjectBudgetIncomeDetailTempRepository projectBudgetIncomeDetailTempRepository; @Autowired + private ProjectBudgetIncomePlanDetailRepository projectBudgetIncomePlanDetailRepository; + @Autowired + private ProjectBudgetIncomePlanDetailTempRepository projectBudgetIncomePlanDetailTempRepository; + @Autowired private ProjectBudgetCostDetailRepository projectBudgetCostDetailRepository; @Autowired private ProjectBudgetCostDetailTempRepository projectBudgetCostDetailTempRepository; @@ -384,6 +388,61 @@ public class ProjectBudgetService { public Integer getBudgetIncomeAmount(Project project){ return projectBudgetIncomeDetailRepository.findAmountByProject(project.getId()); } + + /** + * 清空项目的收入计划 + */ + public void clearBudgetIncomePlanDetail(Project project){ + List incomePlanDetails = projectBudgetIncomePlanDetailRepository.findAllByProjectIdEquals(project.getId()); + if(CollectionUtil.isNotEmpty(incomePlanDetails)){ + projectBudgetIncomePlanDetailRepository.deleteInBatch(incomePlanDetails); + } + } + public void clearBudgetIncomePlanDetailTemp(Project project){ + List incomePlanDetails = projectBudgetIncomePlanDetailTempRepository.findAllByProjectIdEquals(project.getId()); + if(CollectionUtil.isNotEmpty(incomePlanDetails)){ + projectBudgetIncomePlanDetailTempRepository.deleteInBatch(incomePlanDetails); + } + } + + /** + * 保存项目的收入计划 + */ + @Transactional(rollbackFor = RuntimeException.class) + public void saveBudgetIncomePlanDetail(Project project, List detailList){ + clearBudgetIncomePlanDetail(project); + if(CollectionUtil.isNotEmpty(detailList)){ + for (ProjectBudgetIncomePlanDetail projectBudgetIncomePlanDetail : detailList) { + projectBudgetIncomePlanDetail.setProjectId(project.getId()); + } + projectBudgetIncomePlanDetailRepository.save(detailList); + } + } + @Transactional(rollbackFor = RuntimeException.class) + public void saveBudgetIncomePlanDetailTemp(Project project, List detailList){ + clearBudgetIncomePlanDetailTemp(project); + if(CollectionUtil.isNotEmpty(detailList)){ + for (ProjectBudgetIncomePlanDetailTemp projectBudgetIncomePlanDetail : detailList) { + projectBudgetIncomePlanDetail.setProjectId(project.getId()); + } + projectBudgetIncomePlanDetailTempRepository.save(detailList); + } + + } + + /** + * 获取项目的收入计划 + */ + public List getBudgetIncomePlanDetail(Project project){ + return projectBudgetIncomePlanDetailRepository.findAllByProjectIdEquals(project.getId()); + } + /** + * 获取项目的收入计划的收款金额 + */ + public BigDecimal getBudgetIncomePlanReceiveAmount(Project project){ + return projectBudgetIncomePlanDetailRepository.findReceiveAmountByProject(project.getId()); + } + /** * 清空项目的成本明细 */ @@ -438,6 +497,18 @@ public class ProjectBudgetService { public Integer getBudgetCostAmount(Project project){ return projectBudgetCostDetailRepository.findAmountByProject(project.getId()); } + /** + * 获取项目的项目管理总支出金额 + */ + public BigDecimal getBudgetCostUnderwrittenAmountTotal(Project project){ + return projectBudgetCostDetailRepository.findUnderwrittenAmountByProject(project.getId()); + } + /** + * 获取项目的成本总支出金额 + */ + public BigDecimal getBudgetCostPayAmountTotal(Project project){ + return projectBudgetCostDetailRepository.findPayAmountByProject(project.getId()); + } /** * 清空项目的项目管理成本明细 */ @@ -497,6 +568,12 @@ public class ProjectBudgetService { public Integer getBudgetCostProjectManageAmount(Project project){ return projectBudgetCostProjectManageDetailRepository.findAmountByProject(project.getId()); } + /** + * 获取项目的项目管理总支出金额 + */ + public BigDecimal getBudgetCostProjectManagePayAmount(Project project){ + return projectBudgetCostProjectManageDetailRepository.findPayAmountByProject(project.getId()); + } private List getFixedNotDeletable() { List projectManageDetails = new ArrayList<>(6); for (String fixedProjectManageDetail : fixedProjectManageDetails) { @@ -819,6 +896,14 @@ public class ProjectBudgetService { .collect(Collectors.toList()); projectBudgetIncomeDetailRepository.save(incomeDetails); } + //收入计划 + List projectBudgetIncomePlanDetailTemps = projectBudgetIncomePlanDetailTempRepository.findAllByProjectIdEquals(p.getId()); + if(CollectionUtil.isNotEmpty(projectBudgetIncomePlanDetailTemps)){ + List incomePlanDetails = projectBudgetIncomePlanDetailTemps.stream() + .map(ProjectBudgetIncomePlanDetailTemp::toProjectBudgetIncomePlanDetail) + .collect(Collectors.toList()); + projectBudgetIncomePlanDetailRepository.save(incomePlanDetails); + } //成本明细 List projectBudgetCostDetailTemps = projectBudgetCostDetailTempRepository.findAllByProjectIdEquals(p.getId()); if(CollectionUtil.isNotEmpty(projectBudgetCostDetailTemps)){ @@ -848,6 +933,8 @@ public class ProjectBudgetService { private void clearBudgetDetail(Project p) { //收入明细 clearBudgetIncomeDetail(p); + //收入明细 + clearBudgetIncomePlanDetail(p); //成本明细 clearBudgetCostDetail(p); //项目管理明细 @@ -855,8 +942,4 @@ public class ProjectBudgetService { //资金计划明细 clearBudgetPlanDetail(p); } - - public void findAll(Project project) { - - } } diff --git a/src/main/java/cn/palmte/work/service/ProjectService.java b/src/main/java/cn/palmte/work/service/ProjectService.java index c7c9eee..618370e 100644 --- a/src/main/java/cn/palmte/work/service/ProjectService.java +++ b/src/main/java/cn/palmte/work/service/ProjectService.java @@ -14,6 +14,7 @@ import top.jfunc.common.db.utils.Pagination; import top.jfunc.common.utils.CollectionUtil; import top.jfunc.common.utils.StrUtil; +import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @@ -190,6 +191,10 @@ public class ProjectService { project.setCollaborator(null); project.setCollaboratorUrl(null); } + if (project.getUnderwrittenMode() <= 2) { + project.setAdvancePeakAmount(new BigDecimal(0)); + project.setAdvanceInterestAmount(new BigDecimal(0)); + } project.setProjectNo(projectNo); project.setTypeDesc(TypeEnum.parseType(project.getType()).getTypeDesc()); project.setUnderwrittenModeStr(UnderwrittenModeEnum.parseUnderwrittenMode(project.getUnderwrittenMode()).getUnderwrittenModeStr()); @@ -249,6 +254,13 @@ public class ProjectService { projectInDb.setCollaborator(project.getCollaborator()); projectInDb.setCollaboratorUrl(project.getCollaboratorUrl()); } + if (project.getUnderwrittenMode() <= 2) { + projectInDb.setAdvancePeakAmount(new BigDecimal(0)); + projectInDb.setAdvanceInterestAmount(new BigDecimal(0)); + } else { + projectInDb.setAdvanceInterestAmount(project.getAdvanceInterestAmount()); + projectInDb.setAdvancePeakAmount(project.getAdvancePeakAmount()); + } projectInDb.setGrossProfit(project.getGrossProfit()); projectInDb.setGrossProfitMargin(project.getGrossProfitMargin()); projectInDb.setStartDate(project.getStartDate()); @@ -261,8 +273,6 @@ public class ProjectService { projectInDb.setPrincipal(project.getPrincipal()); projectInDb.setContractTime(project.getContractTime()); projectInDb.setBidsTime(project.getBidsTime()); - projectInDb.setAdvanceInterestAmount(project.getAdvanceInterestAmount()); - projectInDb.setAdvancePeakAmount(project.getAdvancePeakAmount()); projectInDb.setMainContractCollectionTerms(project.getMainContractCollectionTerms()); projectInDb.setMainContractResolvePlan(project.getMainContractResolvePlan()); projectInDb.setCalculationCollection(project.getCalculationCollection()); diff --git a/src/main/java/cn/palmte/work/utils/excel/ExportExcelUtils.java b/src/main/java/cn/palmte/work/utils/excel/ExportExcelUtils.java index a76a5ad..fc07610 100644 --- a/src/main/java/cn/palmte/work/utils/excel/ExportExcelUtils.java +++ b/src/main/java/cn/palmte/work/utils/excel/ExportExcelUtils.java @@ -1042,7 +1042,7 @@ public class ExportExcelUtils { totalCell.setCellValue("总计"); } else if (i == 4) { totalCell.setCellType(CellType.NUMERIC); - totalCell.setCellValue(incomeTotalAmount); + totalCell.setCellValue((incomeTotalAmount == null) ? 0 : incomeTotalAmount); } else if (i == 7) { totalCell.setCellType(CellType.NUMERIC); totalCell.setCellValue(Utils.format(budgetBean.getIncomeTotalTaxInclude())); @@ -1059,7 +1059,76 @@ public class ExportExcelUtils { } } - public void exportCostDetailExcel(String[] headers, String[] columns, Project project, BudgetBean budgetBean, List budgetCostDetail, Integer costTotalAmount, Map procurementMap, String pattern, int rowIndex, String sheetName, ServletOutputStream outputStream) { + + public void exportIncomePlanDetailExcel(String[] headers, String[] columns, Project project, BudgetBean budgetBean, List budgetIncomePlanDetail, BigDecimal incomePlanTotal, String pattern, int rowIndex, String sheetName, ServletOutputStream outputStream) { + // 遍历集合数据,产生数据行 + int index = rowIndex; + XSSFSheet sheet = workbook.createSheet(sheetName); + sheet.setDefaultColumnWidth((short)20); + Font font3 = workbook.createFont(); + font3.setColor(HSSFColor.HSSFColorPredefined.BLUE.getIndex()); + Row title = sheet.createRow(index++); + for (int i = 0; i < headers.length; i++) { + Cell firstCell = title.createCell(i); + firstCell.setCellStyle(style); + firstCell.setCellType(CellType.STRING); + firstCell.setCellValue(headers[i]); + } + for (int i = 0; i < budgetIncomePlanDetail.size(); i++) { + ProjectBudgetIncomePlanDetail incomePlanDetail = budgetIncomePlanDetail.get(i); + Row row = sheet.createRow(index++); + for (int j = 0; j < headers.length; j++) { + Cell secondCell = row.createCell(j); + secondCell.setCellStyle(style2); + Object value = ObjectKit.get(incomePlanDetail, columns[j]); + if ("tempId".equals(columns[j])) { + value = i + 1; + } + if (value == null) { + secondCell.setCellType(CellType.STRING); + secondCell.setCellValue(""); + } else { + if (value instanceof Integer) { + secondCell.setCellType(CellType.NUMERIC); + secondCell.setCellValue((int) value); + } else if (value instanceof Long) { + secondCell.setCellType(CellType.NUMERIC); + secondCell.setCellValue((long) value); + } else if (value instanceof Double) { + secondCell.setCellType(CellType.NUMERIC); + secondCell.setCellValue((double) value); + } else if (value instanceof BigDecimal) { + secondCell.setCellType(CellType.NUMERIC); + secondCell.setCellValue(Utils.format(((BigDecimal) value))); + } else if (value instanceof Date) { + secondCell.setCellType(CellType.STRING); + String date_str = DateKit.toStr((Date) value, pattern); + secondCell.setCellValue(date_str); + } else { + secondCell.setCellType(CellType.STRING); + secondCell.setCellValue(value.toString()); + } + } + } + } + Row total = sheet.createRow(index); + for (int i = 0; i < headers.length; i++) { + Cell totalCell = total.createCell(i); + totalCell.setCellStyle(style2); + if (i == 0) { + totalCell.setCellType(CellType.STRING); + totalCell.setCellValue("总计"); + } else if (i == 3) { + totalCell.setCellType(CellType.NUMERIC); + totalCell.setCellValue(Utils.format(incomePlanTotal)); + } else { + totalCell.setCellType(CellType.STRING); + totalCell.setCellValue(""); + } + } + } + + public void exportCostDetailExcel(String[] headers, String[] columns, Project project, BudgetBean budgetBean, List budgetCostDetail, Integer costTotalAmount, BigDecimal costUnderwrittenAmountTotal, BigDecimal costPayAmountTotal, Map procurementMap, String pattern, int rowIndex, String sheetName, ServletOutputStream outputStream) { // 遍历集合数据,产生数据行 int index = rowIndex; XSSFSheet sheet = workbook.createSheet(sheetName); @@ -1094,6 +1163,14 @@ public class ExportExcelUtils { } } else if ("category".equals(columns[j])) { value = procurementMap.get(value); + } else if ("isUnderwritten".equals(columns[j])) { + if ((Integer) value == 0) { + value = ""; + } else if ((Integer) value == 1) { + value = "是"; + } else if ((Integer) value == 2) { + value = "否"; + } } if (value == null) { secondCell.setCellType(CellType.STRING); @@ -1131,7 +1208,7 @@ public class ExportExcelUtils { totalCell.setCellValue("总计"); } else if (i == 5) { totalCell.setCellType(CellType.NUMERIC); - totalCell.setCellValue(costTotalAmount); + totalCell.setCellValue((costTotalAmount == null) ? 0 : costTotalAmount); } else if (i == 8) { totalCell.setCellType(CellType.NUMERIC); totalCell.setCellValue(Utils.format(budgetBean.getCostPurchaseTotalTaxInclude())); @@ -1141,6 +1218,12 @@ public class ExportExcelUtils { } else if (i == 10) { totalCell.setCellType(CellType.NUMERIC); totalCell.setCellValue(Utils.format(budgetBean.getCostPurchaseTotalTax())); + } else if (i == 13) { + totalCell.setCellType(CellType.NUMERIC); + totalCell.setCellValue(Utils.format(costUnderwrittenAmountTotal)); + } else if (i == 15) { + totalCell.setCellType(CellType.NUMERIC); + totalCell.setCellValue(Utils.format(costPayAmountTotal)); } else { totalCell.setCellType(CellType.STRING); totalCell.setCellValue(""); @@ -1148,7 +1231,7 @@ public class ExportExcelUtils { } } - public void exportCostManageDetailExcel(String[] headers, String[] columns, Project project, BudgetBean budgetBean, List budgetCostProjectManageDetail, Integer costProjectManageTotalAmount, String pattern, int rowIndex, String sheetName, ServletOutputStream outputStream) { + public void exportCostManageDetailExcel(String[] headers, String[] columns, Project project, BudgetBean budgetBean, List budgetCostProjectManageDetail, Integer costProjectManageTotalAmount, BigDecimal managePayAmountTotal, String pattern, int rowIndex, String sheetName, ServletOutputStream outputStream) { // 遍历集合数据,产生数据行 int index = rowIndex; XSSFSheet sheet = workbook.createSheet(sheetName); @@ -1178,6 +1261,8 @@ public class ExportExcelUtils { value = "业务费用"; } else if ((Integer) value == 3) { value = "其他费用"; + } else if ((Integer) value == 4) { + value = "保证金"; } } if (value == null) { @@ -1216,10 +1301,13 @@ public class ExportExcelUtils { totalCell.setCellValue("总计"); } else if (i == 5) { totalCell.setCellType(CellType.NUMERIC); - totalCell.setCellValue(costProjectManageTotalAmount); + totalCell.setCellValue((costProjectManageTotalAmount == null) ? 0 : costProjectManageTotalAmount); } else if (i == 7) { totalCell.setCellType(CellType.NUMERIC); totalCell.setCellValue(Utils.format(budgetBean.getCostProjectManageTaxExclude())); + } else if (i == 9) { + totalCell.setCellType(CellType.NUMERIC); + totalCell.setCellValue(Utils.format(managePayAmountTotal)); } else { totalCell.setCellType(CellType.STRING); totalCell.setCellValue(""); diff --git a/src/main/resources/sql/fourcal-purge.sql b/src/main/resources/sql/fourcal-purge.sql index 1c14ea3..cd60715 100644 --- a/src/main/resources/sql/fourcal-purge.sql +++ b/src/main/resources/sql/fourcal-purge.sql @@ -5572,7 +5572,7 @@ CREATE TABLE `project` ( `end_date` datetime NOT NULL COMMENT '项目结束时间,精确到月', `underwritten_mode` int(11) NOT NULL COMMENT '垫资模式:1A类-不垫资(战略合作),2B类-不垫资(背靠背),3C类-垫资(账期覆盖),4D类-垫资(账期不覆盖)', `customer` varchar(255) NOT NULL COMMENT '客户名称', - `terminal_customer` varchar(255) NOT NULL COMMENT '终端客户名称', + `terminal_customer` varchar(255) NOT NULL COMMENT '最终用户名称', `advance_interest_amount` decimal(16,2) NOT NULL COMMENT '垫资利息(元为单位)', `advance_peak_amount` decimal(16,2) NOT NULL COMMENT '垫资峰值', `contract_amount` decimal(16,2) NOT NULL COMMENT '合同金额', diff --git a/src/main/resources/sql/fourcal.sql b/src/main/resources/sql/fourcal.sql index b328214..9e8fa9a 100644 --- a/src/main/resources/sql/fourcal.sql +++ b/src/main/resources/sql/fourcal.sql @@ -7579,7 +7579,7 @@ CREATE TABLE `project` ( `end_date` datetime NOT NULL COMMENT '项目结束时间,精确到月', `underwritten_mode` int(11) NOT NULL COMMENT '垫资模式:1A类-不垫资(战略合作),2B类-不垫资(背靠背),3C类-垫资(账期覆盖),4D类-垫资(账期不覆盖)', `customer` varchar(255) NOT NULL COMMENT '客户名称', - `terminal_customer` varchar(255) NOT NULL COMMENT '终端客户名称', + `terminal_customer` varchar(255) NOT NULL COMMENT '最终用户名称', `advance_interest_amount` decimal(16,2) NOT NULL COMMENT '垫资利息(元为单位)', `advance_peak_amount` decimal(16,2) NOT NULL COMMENT '垫资峰值', `contract_amount` decimal(16,2) NOT NULL COMMENT '合同金额', diff --git a/src/main/resources/static/assets/js/project_budget.js b/src/main/resources/static/assets/js/project_budget.js index c19f244..d46b741 100644 --- a/src/main/resources/static/assets/js/project_budget.js +++ b/src/main/resources/static/assets/js/project_budget.js @@ -346,6 +346,7 @@ function checkIfFillIn() { var customer = $("#customer").val(); var terminalCustomer = $("#terminalCustomer").val(); var valueRisk = $("#valueRisk").val(); + var principal = $("#principal").val(); // var incomeDeviceTaxInclude = $("#incomeDeviceTaxInclude").val(); // var incomeDeviceTaxExclude = $("#incomeDeviceTaxExclude").val(); @@ -417,13 +418,13 @@ function checkIfFillIn() { } - if (advanceInterestAmount == undefined || advanceInterestAmount.length <= 0) { + if (underwrittenMode > 2 && (advanceInterestAmount == undefined || advanceInterestAmount.length <= 0)) { window.confirm('垫资利息不能为空'); check = 1; return; } - if (advancePeakAmount == undefined || advancePeakAmount.length <= 0) { + if (underwrittenMode > 2 && (advancePeakAmount == undefined || advancePeakAmount.length <= 0)) { window.confirm('垫资峰值不能为空'); check = 1; return; @@ -490,7 +491,7 @@ function checkIfFillIn() { } if (terminalCustomer == undefined || terminalCustomer.length <= 0) { - window.confirm('终端客户名称不能为空'); + window.confirm('最终用户名称不能为空'); check = 1; return; } @@ -500,6 +501,12 @@ function checkIfFillIn() { check = 1; return; } + + if (principal == undefined || principal.length <= 0) { + window.confirm('项目负责人不能为空'); + check = 1; + return; + } } /** diff --git a/src/main/resources/static/assets/js/project_budget_cost.js b/src/main/resources/static/assets/js/project_budget_cost.js index 335b686..65e8c76 100644 --- a/src/main/resources/static/assets/js/project_budget_cost.js +++ b/src/main/resources/static/assets/js/project_budget_cost.js @@ -13,7 +13,14 @@ COST_DETAIL={ "taxRate":[true,"税率","number"], "totalTaxInclude":[true,"含税总金额","number"], "totalTaxExclude":[true,"不含税金额","number"], - "totalTax":[true,"税金","number"] + "totalTax":[true,"税金","number"], + "contractParty":[true,"签约方","string"], + "isUnderwritten":[true,"是否垫资","string"], + "underwrittenAmount":[true,"预估垫资金额","number"], + "payTime":[true,"支出时间","string"], + "payAmount":[true,"支出金额","number"], + "payWay":[true,"付款方式","string"], + "remark":[true,"备注","string"] }; /* [ @@ -148,6 +155,8 @@ $(function () { bindOtherOtherChangeable(); //绑定采购明细中select联动事件 bindTypeSelectChange(); + //绑定删除按钮 + bindDeleteBtnCost(); //初始化大类和类别的数据 getAjax(base+"/procurement/type/map", null, initTypeCategory); @@ -197,6 +206,19 @@ function appendTrCost() { ''+ ''+ ''+ + '\n' + + '\n' + + ' \n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + + '\n' + ''+ ''; @@ -205,6 +227,8 @@ function appendTrCost() { bindDeleteBtnCost(); //绑定序号 bindNum(); + //绑定时间 + bindTime(); //重新绑定 bindChangeableInput(); //绑定总计值 @@ -215,6 +239,13 @@ function appendTrCost() { bindNumberInput(); } +/** + * 绑定时间选择器 + */ +function bindTime() { + $('[data-am-datepicker]').datepicker(); +} + /** * 绑定每一行的删除事件,删除当前的一行tr,修改总计值 */ @@ -227,6 +258,8 @@ function bindDeleteBtnCost() { updateTotal("input-changeable-total-tax-include-cost", "input-changeable-total-total-tax-include-cost"); updateTotal("input-changeable-total-tax-exclude-cost", "input-changeable-total-total-tax-exclude-cost"); updateTotal("input-changeable-total-tax-cost", "input-changeable-total-total-tax-cost"); + updateTotal("input-changeable-total-pay-amount-cost", "input-changeable-total-total-pay-amount-cost"); + updateTotal("input-changeable-total-underwritten-amount-cost", "input-changeable-total-total-underwritten-amount-cost"); }); } @@ -252,6 +285,14 @@ function bindCostTotal() { updateTotal("input-changeable-total-tax-exclude-cost", "input-changeable-total-total-tax-exclude-cost"); updateTotal("input-changeable-total-tax-cost", "input-changeable-total-total-tax-cost"); }); + //收款金额变化 + $(".input-changeable-total-pay-amount-cost").change(function () { + updateTotal("input-changeable-total-pay-amount-cost", "input-changeable-total-total-pay-amount-cost"); + }); + //垫资金额变化 + $(".input-changeable-total-underwritten-amount-cost").change(function () { + updateTotal("input-changeable-total-underwritten-amount-cost", "input-changeable-total-total-underwritten-amount-cost"); + }); } /** diff --git a/src/main/resources/static/assets/js/project_budget_cost_project_manage.js b/src/main/resources/static/assets/js/project_budget_cost_project_manage.js index 4eabecd..1b66ed2 100644 --- a/src/main/resources/static/assets/js/project_budget_cost_project_manage.js +++ b/src/main/resources/static/assets/js/project_budget_cost_project_manage.js @@ -12,6 +12,8 @@ COST_PROJECT_MANAGE_DETAIL={ "amount":[true,"数量","string"], "price":[true,"单价","price"], "total":[true,"总金额","number"], + "payTime":[true,"支出时间","string"], + "payAmount":[true,"支出金额","number"], "predictMethod":[false,"预估计算方法","string"], "predictWhy":[false,"预估依据","string"], "remark":[false,"备注","string"], @@ -91,6 +93,8 @@ $(function () { bindChangeableInputProjectManage(); initTypeCategoryManage(); + + bindDeleteBtnCostManage(); }); /** * 采购成本增加一行 @@ -104,6 +108,7 @@ function appendTrCostProjectManage() { ' \n' + ' \n' + ' \n' + + ' \n' + ' \n' + ' \n' + ' \n' + @@ -115,6 +120,7 @@ function appendTrCostProjectManage() { ' \n' + ' \n' + ' \n' + + ' \n' + ' \n' + ' \n' + ' \n' + @@ -123,6 +129,8 @@ function appendTrCostProjectManage() { ' \n' + ' \n' + ' \n' + + ' \n' + + ' \n' + ' \n' + ' \n' + ' \n' + @@ -132,6 +140,7 @@ function appendTrCostProjectManage() { $("#manageTotal").before(template); //重新绑定删除事件和input修改事件 bindDeleteBtnCostManage(); + bindTime(); //绑定序号 bindNum(); bindChangeableInputProjectManage(); @@ -142,6 +151,13 @@ function appendTrCostProjectManage() { bindNumberInput(); } +/** + * 绑定时间选择器 + */ +function bindTime() { + $('[data-am-datepicker]').datepicker(); +} + /** * 绑定每一行的删除事件,删除当前的一行tr,修改总计值 */ @@ -152,6 +168,7 @@ function bindDeleteBtnCostManage() { bindNum(); updateAmount("input-changeable-amount-project-manage", "input-changeable-total-amount-project-manage"); updateTotal("input-changeable-total-project-manage", "input-changeable-total-total-project-manage"); + updateTotal("input-changeable-pay-amount-project-manage", "input-changeable-total-pay-amount-project-manage"); }); } @@ -168,6 +185,10 @@ function bindCostManageTotal() { $(".input-changeable-price-project-manage").change(function () { updateTotal("input-changeable-total-project-manage", "input-changeable-total-total-project-manage"); }); + //收款金额变化 + $(".input-changeable-pay-amount-project-manage").change(function () { + updateTotal("input-changeable-pay-amount-project-manage", "input-changeable-total-pay-amount-project-manage"); + }); } /** @@ -244,6 +265,12 @@ function initTypeCategoryManage() { id:"8" }); SELECT_TYPE_CATEGORY_MAP_DATA_MANAGER[2] = temp2; + var temp4 = []; + temp4.push({ + name:"保证金", + id:"9" + }); + SELECT_TYPE_CATEGORY_MAP_DATA_MANAGER[4] = temp4; SELECT_CATEGORY_TYPE_MAP_DATA_MANAGER[1] = 1; SELECT_CATEGORY_TYPE_MAP_DATA_MANAGER[2] = 1; @@ -253,6 +280,7 @@ function initTypeCategoryManage() { SELECT_CATEGORY_TYPE_MAP_DATA_MANAGER[6] = 2; SELECT_CATEGORY_TYPE_MAP_DATA_MANAGER[7] = 2; SELECT_CATEGORY_TYPE_MAP_DATA_MANAGER[8] = 2; + SELECT_CATEGORY_TYPE_MAP_DATA_MANAGER[9] = 4; } function bindChangeableInputProjectManage() { //数量改变 diff --git a/src/main/resources/static/assets/js/project_budget_income_plan.js b/src/main/resources/static/assets/js/project_budget_income_plan.js new file mode 100644 index 0000000..0c1f334 --- /dev/null +++ b/src/main/resources/static/assets/js/project_budget_income_plan.js @@ -0,0 +1,112 @@ +/** + * 一个收入详情的字段 + */ +//INCOME_DETAIL_ARR=["type","name","unit","amount","price","taxRate","totalTaxInclude","totalTaxExclude"]; +INCOME_PLAN_DETAIL={ + "num":[false,"序号","string"], + "receivePoint":[true,"收款节点","string"], + "receiveTime":[true,"收款时间","string"], + "receiveAmount":[true,"收款金额","number"] +}; + +$(function () { + $("#income-plan-detail").click(function () { + $('#my-prompt-income-plan-detail').modal({ + relatedTarget: this, + closeOnConfirm:false, + onConfirm: function(e) { + //不能使用e.data,因为无法获取动态添加的 + var data = collectData("am-modal-prompt-input-income-plan"); + //data = prepareAjaxData(data, INCOME_DETAIL_ARR, $("#id").val(),false); + data = prepareAjaxDataVerify(data, INCOME_PLAN_DETAIL, $("#id").val()); + if(data.details){ + postAjax(base+"/project/budgetEditSaveIncomePlanDetail", data, updateIncomePlanData); + } + }, + onCancel: function(e) { + } + }); + }); +}); + +//保存收入计划表 +$(function () { + $("#incomePlanTableSave").click(function () { + var data = collectData("am-modal-prompt-input-income-plan"); + data = prepareAjaxDataVerify(data, INCOME_PLAN_DETAIL, $("#id").val()); + if(data.details){ + postAjax(base+"/project/budgetEditSaveIncomePlanDetail", data, updateIncomePlanData); + } + }); + $("#incomePlanAddBtn").click(function () { + appendTrIncomePlan(); + }); + $(".am-modal-line-delete").click(function () { + //删除自己对应的tr + $(this).parent().parent().remove(); + bindNum(); + updateTotal("input-changeable-receive-income-plan", "input-changeable-total-receive-income-plan"); + }); +}); + + +/** + * 更新页面收入的数据【累加】 + */ +function updateIncomePlanData(data,returnData) { + layuiAlert("保存成功"); + $('#my-prompt-income-plan-detail').modal('close'); +} + + + + +/** + * 收入明细增加一行 + */ +function appendTrIncomePlan() { + var template = '\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' '; + $("#incomePlanTotal").before(template); + //重新绑定删除事件和input修改事件 + bindDeleteBtnIncomePlan(); + bindTime(); + bindNum(); + bindIncomePlanTotal(); + //绑定数字输入框保留两位小数 + bindNumberInput(); +} + +/** + * 绑定每一行的删除事件,删除当前的一行tr,修改总计值 + */ +function bindDeleteBtnIncomePlan() { + $(".am-modal-line-delete").click(function () { + //删除自己对应的tr + $(this).parent().parent().remove(); + bindNum(); + updateTotal("input-changeable-receive-income-plan", "input-changeable-total-receive-income-plan"); + }); +} + +/** + * 绑定每个可改变的输入框,修改后改变对应输入框的值 + */ +function bindIncomePlanTotal() { + //收款金额变化 + $(".input-changeable-receive-income-plan").change(function () { + updateTotal("input-changeable-receive-income-plan", "input-changeable-total-receive-income-plan"); + }); +} + +/** + * 绑定时间选择器 + */ +function bindTime() { + $('[data-am-datepicker]').datepicker(); +} \ No newline at end of file diff --git a/src/main/resources/templates/admin/monthly_settle_info.ftl b/src/main/resources/templates/admin/monthly_settle_info.ftl index 2ccadb9..03f5beb 100644 --- a/src/main/resources/templates/admin/monthly_settle_info.ftl +++ b/src/main/resources/templates/admin/monthly_settle_info.ftl @@ -102,7 +102,7 @@
-
月度结算表明细 / +
PMO项目执行进度管理明细 / ${monthlySettle.projectName!}
diff --git a/src/main/resources/templates/admin/monthly_settle_list.ftl b/src/main/resources/templates/admin/monthly_settle_list.ftl index 1872525..c692ae6 100644 --- a/src/main/resources/templates/admin/monthly_settle_list.ftl +++ b/src/main/resources/templates/admin/monthly_settle_list.ftl @@ -6,7 +6,7 @@
项目管理 / - 月度结算 + PMO项目执行进度管理
diff --git a/src/main/resources/templates/admin/project_approve.ftl b/src/main/resources/templates/admin/project_approve.ftl index 7558cad..a783f88 100644 --- a/src/main/resources/templates/admin/project_approve.ftl +++ b/src/main/resources/templates/admin/project_approve.ftl @@ -115,9 +115,9 @@
-
+
hidden>
-
+
hidden>
@@ -320,11 +320,11 @@ <#if project.certainty??> <#if (project.certainty) =1> - + <#elseif (project.certainty) =2> - + <#elseif (project.certainty) =3> - + <#else> @@ -374,7 +374,7 @@
-
+
<#----> @@ -445,7 +445,7 @@
-
+
<#if project.signType??> @@ -653,6 +653,7 @@
+
+ <#--收入明细表--> + + + + + + + + + + <#if incomePlanDetails??> + <#list incomePlanDetails as incomePlanDetail> + + + + + + + + + + + + + + + + +
序号收款节点收款时间收款金额(元)
${(incomePlanDetail_index+1)!}
总计
+
<#--采购成本明细表--> 含税总金额(元) - <#----> + + + + + + + <#if costDetails??> @@ -834,6 +874,32 @@ value="${Utils.format(costDetail.totalTax,'0.00')}" readonly> + + + + + + + <#-- - <#----> - + + + + + + +
不含税金额(元) 税金(元)操作签约方是否垫资预估垫资金额(元)支出时间支出金额(元)付款方式备注
+ <#----> + <#if costDetail.isUnderwritten ==0 > + + <#elseif costDetail.isUnderwritten ==1> + 是 + <#elseif costDetail.isUnderwritten ==2> + 否 + +
@@ -874,6 +945,8 @@ 数量 单价 总金额(元) + 支出时间 + 支出金额(元) 预估计算方法 预估依据 备注 @@ -928,6 +1001,8 @@ class="am-modal-prompt-input am-modal-prompt-input-cost-project-manage input-changeable-total-project-manage" value="${Utils.format(costProjectManageDetail.total,'0.00')}" readonly> + + @@ -958,6 +1033,8 @@ + + <#----> diff --git a/src/main/resources/templates/admin/project_budget_edit.ftl b/src/main/resources/templates/admin/project_budget_edit.ftl index 466e017..d995aae 100644 --- a/src/main/resources/templates/admin/project_budget_edit.ftl +++ b/src/main/resources/templates/admin/project_budget_edit.ftl @@ -43,9 +43,10 @@
-
*终端客户名称
+
*最终用户名称
-
@@ -338,7 +339,7 @@
-
项目负责人
+
*项目负责人
-
签单方式
+
直签
+ + + + + + + + + + + + + + + + + + +
+ +
+
+
@@ -673,6 +717,13 @@ 含税总金额(元) 不含税金额(元) 税金(元) + 签约方 + 是否垫资 + 预估垫资金额(元) + 支出时间 + 支出金额(元) + 付款方式 + 备注 操作 @@ -711,6 +762,19 @@ + + + + + + + + + @@ -728,6 +792,13 @@ + + + + + + + @@ -755,6 +826,8 @@ 数量 单价 总金额(元) + 支出时间 + 支出金额(元) 预估计算方法 预估依据 备注 @@ -769,6 +842,7 @@ + @@ -785,6 +859,9 @@ + <#if costProjectManageDetail.type == 4> + + type="text"<#else>type="hidden" class="am-modal-prompt-input am-modal-prompt-input-cost-project-manage am-modal-prompt-input-cost-project-manage-category2" value="${costProjectManageDetail.name!}"> @@ -793,6 +870,8 @@ oninput="if(value.length>8)value=value.slice(0,8)"> + + @@ -812,6 +891,8 @@ + + @@ -1221,6 +1302,7 @@ + @@ -1234,8 +1316,12 @@ var underwrittenMode = $("#underwrittenMode").val(); if (underwrittenMode == 1) { $("#coop").show(); - } else { + $("#noUnder").hide(); + } else if (underwrittenMode == 2) { $("#coop").hide(); + $("#noUnder").hide(); + } else { + $("#noUnder").show(); } }; diff --git a/src/main/resources/templates/admin/project_estimate_add.ftl b/src/main/resources/templates/admin/project_estimate_add.ftl index e22b3dc..4d9bd34 100644 --- a/src/main/resources/templates/admin/project_estimate_add.ftl +++ b/src/main/resources/templates/admin/project_estimate_add.ftl @@ -11,8 +11,8 @@
@@ -122,7 +122,7 @@
-
+