diff --git a/src/main/java/cn/palmte/work/controller/backend/SpaceController.java b/src/main/java/cn/palmte/work/controller/backend/SpaceController.java index 6fe3bf2..8908dc4 100644 --- a/src/main/java/cn/palmte/work/controller/backend/SpaceController.java +++ b/src/main/java/cn/palmte/work/controller/backend/SpaceController.java @@ -61,7 +61,7 @@ public class SpaceController extends BaseController { searchInfo.putIfAbsent("certainty", String.valueOf(certainty)); searchInfo.putIfAbsent("deptName", "销售管理部"); searchInfo.putIfAbsent("estimateStatus", String.valueOf(1)); - Page page = projectService.list(searchInfo, pageNumber, pageSize); + Page page = spaceService.list(searchInfo, pageNumber, pageSize); List list = page.getList(); if(CollectionUtil.isNotEmpty(list)){ @@ -82,15 +82,15 @@ public class SpaceController extends BaseController { public void export(@RequestParam(value = "keywords", required = false) String keywords, @RequestParam(value = "certainty") int certainty, HttpServletResponse httpServletResponse) throws IOException { Map searchInfo = getSearchInfo(keywords); searchInfo.putIfAbsent("certainty", String.valueOf(certainty)); + searchInfo.putIfAbsent("deptName", "销售管理部"); + searchInfo.putIfAbsent("estimateStatus", String.valueOf(1)); 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", - "principal", "valueRisk", "mainContractCollectionTerms", "mainContractResolvePlan", "calculationCollection", "approveStatusDesc", "approveName", "creatorName", "deptName", "startDate", "endDate", "lastUpdateTime"}; + String[] headers = {"项目编号", "项目名称", "项目类型", "垫资模式", "华智产品金额", "华三产品金额", "汇智产品金额", "其他产品金额", "项目把握度", "项目计划招标时间", "预计合同签订时间", + "计收计划", "项目毛利", "合同金额(万元)", "项目解决方案", "具体解决方案", "是否二次签单", "最终用户名称", "客户名称", "紫光汇智直接投标/集成商转签", "负责人", "备注"}; + String[] exportColumns = {"projectNo", "name", "typeDesc", "underwrittenModeStr", "huazhiRound", "huasanRound", "huizhiRound", "ziguangRound", "certaintyStr", "bidsTime", "contractTime", + "calculationCollection", "grossProfitRound", "contractRound", "resolvePlan", "mainContractResolvePlan", "isSecondStr", "terminalCustomer", "customer", "signTypeStr", "principal", "remark"}; ExportUtils.exportToExcel(headers, exportColumns, 1, 10000, - httpServletResponse.getOutputStream(), (pN, pS) -> projectService.list(searchInfo, pN, pS).getList()); + httpServletResponse.getOutputStream(), (pN, pS) -> spaceService.list(searchInfo, pN, pS).getList()); } /** diff --git a/src/main/java/cn/palmte/work/model/Project.java b/src/main/java/cn/palmte/work/model/Project.java index b57c6ff..d00451a 100644 --- a/src/main/java/cn/palmte/work/model/Project.java +++ b/src/main/java/cn/palmte/work/model/Project.java @@ -284,6 +284,9 @@ public class Project { @Transient private String advancePeakAmountRound; + @Transient + private String remark; + /** * 审批任务节点 */ @@ -882,4 +885,12 @@ public class Project { public void setActTaskName(String actTaskName) { this.actTaskName = actTaskName; } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } } diff --git a/src/main/java/cn/palmte/work/model/ProjectExtend.java b/src/main/java/cn/palmte/work/model/ProjectExtend.java new file mode 100644 index 0000000..f307af5 --- /dev/null +++ b/src/main/java/cn/palmte/work/model/ProjectExtend.java @@ -0,0 +1,163 @@ +package cn.palmte.work.model; + +import org.hibernate.annotations.GenericGenerator; + +import javax.persistence.*; +import java.math.BigDecimal; + +/** + * 项目拓展表(预算后项目专用) + * + */ +@Entity +@Table(name = "project_extend") +public class ProjectExtend { + public static final int STATUS_ESTIMATE = 1; + public static final int STATUS_BUDGET = 5; + public static final int STATUS_SETTLE = 10; + public static final int STATUS_FINAL = 15; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @GenericGenerator(name = "persistenceGenerator", strategy = "increment") + private int id; + + @Column(name = "project_id") + private int projectId; + + @Column(name = "is_budget") + private int isBudget; + + /** + * 垫资利息(元为单位) + */ + @Column(name = "advance_interest_amount") + private BigDecimal advanceInterestAmount; + /** + * 垫资峰值 + */ + @Column(name = "advance_peak_amount") + private BigDecimal advancePeakAmount; + /** + * 合同金额 + */ + @Column(name = "contract_amount") + private BigDecimal contractAmount; + /** + *华智产品金额 + */ + @Column(name = "huazhi_product_amount") + private BigDecimal huazhiProductAmount; + /** + *其他产品金额 + */ + @Column(name = "ziguang_other_amount") + private BigDecimal ziguangOtherAmount; + + @Column(name = "gross_profit") + private BigDecimal grossProfit; + + @Column(name = "gross_profit_margin") + private BigDecimal grossProfitMargin; + + @Column(name = "huizhi_product_amount") + private BigDecimal huizhiProductAmount; + + @Column(name = "huasan_product_amount") + private BigDecimal huasanProductAmount; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getProjectId() { + return projectId; + } + + public void setProjectId(int projectId) { + this.projectId = projectId; + } + + public int getIsBudget() { + return isBudget; + } + + public void setIsBudget(int isBudget) { + this.isBudget = isBudget; + } + + public BigDecimal getAdvanceInterestAmount() { + return advanceInterestAmount; + } + + public void setAdvanceInterestAmount(BigDecimal advanceInterestAmount) { + this.advanceInterestAmount = advanceInterestAmount; + } + + public BigDecimal getAdvancePeakAmount() { + return advancePeakAmount; + } + + public void setAdvancePeakAmount(BigDecimal advancePeakAmount) { + this.advancePeakAmount = advancePeakAmount; + } + + public BigDecimal getContractAmount() { + return contractAmount; + } + + public void setContractAmount(BigDecimal contractAmount) { + this.contractAmount = contractAmount; + } + + public BigDecimal getHuazhiProductAmount() { + return huazhiProductAmount; + } + + public void setHuazhiProductAmount(BigDecimal huazhiProductAmount) { + this.huazhiProductAmount = huazhiProductAmount; + } + + public BigDecimal getZiguangOtherAmount() { + return ziguangOtherAmount; + } + + public void setZiguangOtherAmount(BigDecimal ziguangOtherAmount) { + this.ziguangOtherAmount = ziguangOtherAmount; + } + + public BigDecimal getGrossProfit() { + return grossProfit; + } + + public void setGrossProfit(BigDecimal grossProfit) { + this.grossProfit = grossProfit; + } + + public BigDecimal getGrossProfitMargin() { + return grossProfitMargin; + } + + public void setGrossProfitMargin(BigDecimal grossProfitMargin) { + this.grossProfitMargin = grossProfitMargin; + } + + public BigDecimal getHuizhiProductAmount() { + return huizhiProductAmount; + } + + public void setHuizhiProductAmount(BigDecimal huizhiProductAmount) { + this.huizhiProductAmount = huizhiProductAmount; + } + + public BigDecimal getHuasanProductAmount() { + return huasanProductAmount; + } + + public void setHuasanProductAmount(BigDecimal huasanProductAmount) { + this.huasanProductAmount = huasanProductAmount; + } +} diff --git a/src/main/java/cn/palmte/work/model/ProjectExtendRepository.java b/src/main/java/cn/palmte/work/model/ProjectExtendRepository.java new file mode 100644 index 0000000..085dde7 --- /dev/null +++ b/src/main/java/cn/palmte/work/model/ProjectExtendRepository.java @@ -0,0 +1,11 @@ +package cn.palmte.work.model; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +public interface ProjectExtendRepository extends JpaRepository { + + @Query(value = "SELECT * FROM project_extend WHERE project_id = ?1", nativeQuery = true) + ProjectExtend findByProjectId(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 abbecbb..927b480 100644 --- a/src/main/java/cn/palmte/work/service/ProjectBudgetService.java +++ b/src/main/java/cn/palmte/work/service/ProjectBudgetService.java @@ -61,6 +61,10 @@ public class ProjectBudgetService { private SysConfigService sysConfigService; @Autowired private ProcurementTypeRepository procurementTypeRepository; + @Autowired + private ProjectBudgetService projectBudgetService; + @Autowired + private ProjectExtendRepository projectExtendRepository; @Value("#{'${fourcal.fixedprojectmanagedetails}'.split('\\|')}") private String[] fixedProjectManageDetails; @@ -910,9 +914,30 @@ public class ProjectBudgetService { clearBudgetDetail(p); saveBudgetDetail(p); + + saveProjectExtend(p); return p; } + private void saveProjectExtend(Project p) { + ProjectExtend extend = projectExtendRepository.findByProjectId(p.getId()); + if (extend == null) { + extend = new ProjectExtend(); + extend.setProjectId(p.getId()); + extend.setIsBudget(1); + } + List projectBudgetPlanDetails = projectBudgetService.getProjectBudgetPlanDetails(p); + ProjectUnderwrittenPlanStatisticBean bean = projectBudgetService.getProjectUnderwrittenPlanStatisticBean(projectBudgetPlanDetails); + extend.setAdvanceInterestAmount(bean.getCapitalInterest()); + extend.setAdvancePeakAmount(bean.getAmount()); + + BudgetBean budgetBean = projectBudgetService.getBudget(p); + extend.setGrossProfit(budgetBean.getProjectGrossProfit()); + extend.setGrossProfitMargin(budgetBean.getProjectGrossProfitRate()); + + + } + private void saveBudgetDetail(Project p) { //临时表中始终是最新的详情,不管是本次修改还是以前保持的 //收入明细 diff --git a/src/main/java/cn/palmte/work/service/ProjectService.java b/src/main/java/cn/palmte/work/service/ProjectService.java index b1f9df8..faaf28f 100644 --- a/src/main/java/cn/palmte/work/service/ProjectService.java +++ b/src/main/java/cn/palmte/work/service/ProjectService.java @@ -64,6 +64,7 @@ public class ProjectService { */ QueryHelper queryHelper = new QueryHelper("SELECT p.*, FORMAT(p.contract_amount,2) as contractRound, FORMAT(p.huazhi_product_amount,2) as huazhiRound, FORMAT(p.huizhi_product_amount,2) as huizhiRound, FORMAT(p.huasan_product_amount,2) as huasanRound, FORMAT(p.ziguang_other_amount,2) as ziguangRound" + ", FORMAT(p.gross_profit,2) as grossProfitRound, FORMAT(p.gross_profit_margin,2) as grossProfitMarginRound, FORMAT(p.advance_interest_amount,2) as advanceInterestAmountRound, FORMAT(p.advance_peak_amount,2) as advancePeakAmountRound","project","p"); + queryHelper.leftJoin("project_extend pe", "p.id = pe.project_id and pe.is_budget = 1"); if(StrUtil.isNotEmpty(searchInfo.get("status")) && !"-1".equals(searchInfo.get("status"))){ queryHelper.addCondition("p.status=?", Integer.parseInt(searchInfo.get("status"))); } @@ -155,6 +156,32 @@ public class ProjectService { String time = searchInfo.get("contractEndTime") + " 00:00:00"; queryHelper.addCondition("p.contract_time<=?", time); } + + //金额,需判断是概算项目还是过了预算的项目,如过了预算则从project_extend表中取数 + if (StrUtil.isNotEmpty(searchInfo.get("huizhiStart"))) { + queryHelper.addCondition("(pe.is_budget = 0 and p.huizhi_product_amount >= ?) or (pe.is_budget = 1 and pe.huizhi_product_amount >= ?)", searchInfo.get("huizhiStart"), searchInfo.get("huizhiStart")); + } + if (StrUtil.isNotEmpty(searchInfo.get("huizhiEnd"))) { + queryHelper.addCondition("(pe.is_budget = 0 and p.huizhi_product_amount <= ?) or (pe.is_budget = 1 and pe.huizhi_product_amount <= ?)", searchInfo.get("huizhiEnd"), searchInfo.get("huizhiEnd")); + } + if (StrUtil.isNotEmpty(searchInfo.get("huazhiStart"))) { + queryHelper.addCondition("(pe.is_budget = 0 and p.huazhi_product_amount >= ?) or (pe.is_budget = 1 and pe.huazhi_product_amount >= ?)", searchInfo.get("huazhiStart"), searchInfo.get("huazhiStart")); + } + if (StrUtil.isNotEmpty(searchInfo.get("huazhiEnd"))) { + queryHelper.addCondition("(pe.is_budget = 0 and p.huazhi_product_amount <= ?) or (pe.is_budget = 1 and pe.huazhi_product_amount <= ?)", searchInfo.get("huazhiEnd"), searchInfo.get("huazhiEnd")); + } + if (StrUtil.isNotEmpty(searchInfo.get("huasanStart"))) { + queryHelper.addCondition("(pe.is_budget = 0 and p.huasan_product_amount >= ?) or (pe.is_budget = 1 and pe.huasan_product_amount >= ?)", searchInfo.get("huasanStart"), searchInfo.get("huasanStart")); + } + if (StrUtil.isNotEmpty(searchInfo.get("huasanEnd"))) { + queryHelper.addCondition("(pe.is_budget = 0 and p.huasan_product_amount <= ?) or (pe.is_budget = 1 and pe.huasan_product_amount <= ?)", searchInfo.get("huasanEnd"), searchInfo.get("huasanEnd")); + } + if (StrUtil.isNotEmpty(searchInfo.get("otherStart"))) { + queryHelper.addCondition("(pe.is_budget = 0 and p.ziguang_other_amount >= ?) or (pe.is_budget = 1 and pe.ziguang_other_amount >= ?)", searchInfo.get("otherStart"), searchInfo.get("otherStart")); + } + if (StrUtil.isNotEmpty(searchInfo.get("otherEnd"))) { + queryHelper.addCondition("(pe.is_budget = 0 and p.ziguang_other_amount <= ?) or (pe.is_budget = 1 and pe.ziguang_other_amount <= ?)", searchInfo.get("otherEnd"), searchInfo.get("otherEnd")); + } } //项目可见性,根据角色和人员id diff --git a/src/main/java/cn/palmte/work/service/SpaceService.java b/src/main/java/cn/palmte/work/service/SpaceService.java index 9735b2e..1ad7104 100644 --- a/src/main/java/cn/palmte/work/service/SpaceService.java +++ b/src/main/java/cn/palmte/work/service/SpaceService.java @@ -1,10 +1,21 @@ package cn.palmte.work.service; +import cn.palmte.work.bean.StatusEnum; +import cn.palmte.work.model.Admin; +import cn.palmte.work.model.Project; +import cn.palmte.work.model.SysRole; +import cn.palmte.work.model.SysRoleRepository; import cn.palmte.work.pojo.SpaceVO; +import cn.palmte.work.utils.InterfaceUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import top.jfunc.common.db.QueryHelper; +import top.jfunc.common.db.bean.Page; import top.jfunc.common.db.bean.Record; import top.jfunc.common.db.utils.Pagination; +import top.jfunc.common.utils.StrUtil; import java.util.List; import java.util.Map; @@ -13,10 +24,97 @@ import java.util.stream.Collectors; @Service public class SpaceService { + private static final Logger logger = LoggerFactory.getLogger(SpaceService.class); + + @Autowired + private SysRoleRepository sysRoleRepository; @Autowired private Pagination pagination; + public Page list(Map searchInfo, int pageNumber, int pageSize){ + QueryHelper queryHelper = getQueryHelper(searchInfo); + return pagination.paginate(queryHelper.getSql(), Project.class,pageNumber,pageSize); + } + + private QueryHelper getQueryHelper(Map searchInfo) { + QueryHelper queryHelper = new QueryHelper("SELECT p.*, FORMAT(p.contract_amount,2) as contractRound, FORMAT(p.huazhi_product_amount,2) as huazhiRound, FORMAT(p.huizhi_product_amount,2) as huizhiRound, FORMAT(p.huasan_product_amount,2) as huasanRound, FORMAT(p.ziguang_other_amount,2) as ziguangRound" + + ", FORMAT(p.gross_profit,2) as grossProfitRound, '' as remark","project","p"); + queryHelper.leftJoin("project_extend pe", "p.id = pe.project_id and pe.is_budget = 1"); + + queryHelper.addCondition(StrUtil.isNotEmpty(searchInfo.get("name")),"p.name LIKE ?", "%"+searchInfo.get("name")+"%"); + queryHelper.addCondition(StrUtil.isNotEmpty(searchInfo.get("customer")),"p.customer LIKE ?", "%"+searchInfo.get("customer")+"%"); + queryHelper.addCondition(StrUtil.isNotEmpty(searchInfo.get("terminalCustomer")),"p.terminal_customer LIKE ?", "%"+searchInfo.get("terminalCustomer")+"%"); + queryHelper.addCondition(StrUtil.isNotEmpty(searchInfo.get("principal")),"p.principal LIKE ?", "%"+searchInfo.get("principal")+"%"); + + if(StrUtil.isNotEmpty(searchInfo.get("approveStatus")) && !"-1".equals(searchInfo.get("approveStatus"))){ + int approveStatus = Integer.parseInt(searchInfo.get("approveStatus")); + //四种状态满足其一即可 + queryHelper.addCondition("((p.status=? AND p.approve_status_estimate=?) OR (p.status=? AND p.approve_status_budget=?) OR (p.status=? AND p.approve_status_settle=?) OR (p.status=? AND p.approve_status_final=?))", + StatusEnum.ESTIMATE_ACCOUNTS.getStatus(),approveStatus, + StatusEnum.BUDGET_ACCOUNTS.getStatus(),approveStatus, + StatusEnum.SETTLE_ACCOUNTS.getStatus(),approveStatus, + StatusEnum.FINAL_ACCOUNTS.getStatus(),approveStatus); + } + if(StrUtil.isNotEmpty(searchInfo.get("type")) && !"-1".equals(searchInfo.get("type"))){ + queryHelper.addCondition("p.type=?", Integer.parseInt(searchInfo.get("type"))); + } + queryHelper.addCondition(StrUtil.isNotEmpty(searchInfo.get("deptName")),"p.dept_name = ?", searchInfo.get("deptName")); + if(StrUtil.isNotEmpty(searchInfo.get("estimateStatus")) && !"-1".equals(searchInfo.get("estimateStatus"))){ + queryHelper.addCondition("p.approve_status_estimate>=1 and p.approve_status_estimate<=2"); + } + + if(StrUtil.isNotEmpty(searchInfo.get("extend")) && "0".equals(searchInfo.get("extend"))) { + if (StrUtil.isNotEmpty(searchInfo.get("isSecond")) && !"-1".equals(searchInfo.get("isSecond"))) { + queryHelper.addCondition("p.is_second=?", Integer.parseInt(searchInfo.get("isSecond"))); + } + if (StrUtil.isNotEmpty(searchInfo.get("resolvePlan")) && !"-1".equals(searchInfo.get("resolvePlan"))) { + queryHelper.addCondition("p.resolve_plan=?", Integer.parseInt(searchInfo.get("resolvePlan"))); + } + /** + * 只选择了一个时间的情况,就项目时间包括这个时间的 + */ + if (StrUtil.isNotEmpty(searchInfo.get("startDate")) && StrUtil.isEmpty(searchInfo.get("endDate"))) { + String time = searchInfo.get("startDate") + " 00:00:00"; + queryHelper.addCondition("p.start_date<=? AND p.end_date>=?", time, time); + } + if (StrUtil.isNotEmpty(searchInfo.get("endDate")) && StrUtil.isEmpty(searchInfo.get("startDate"))) { + String time = searchInfo.get("endDate") + " 00:00:00"; + queryHelper.addCondition("p.start_date<=? AND p.end_date>=?", time, time); + } + /** + * 两个时间都选了,则包含项目时间 + */ + if (StrUtil.isNotEmpty(searchInfo.get("startDate")) && StrUtil.isNotEmpty(searchInfo.get("endDate"))) { + String startTime = searchInfo.get("startDate") + " 00:00:00"; + String endTime = searchInfo.get("endDate") + " 23:59:59"; + queryHelper.addCondition("p.start_date>=? AND p.end_date<=?", startTime, endTime); + } + if (StrUtil.isNotEmpty(searchInfo.get("contractStartTime"))) { + String time = searchInfo.get("contractStartTime") + " 00:00:00"; + queryHelper.addCondition("p.contract_time>=?", time); + } + if (StrUtil.isNotEmpty(searchInfo.get("contractEndTime"))) { + String time = searchInfo.get("contractEndTime") + " 00:00:00"; + queryHelper.addCondition("p.contract_time<=?", time); + } + } + + //项目可见性,根据角色和人员id + Admin admin = InterfaceUtil.getAdmin(); + int roleId = admin.getRoleId(); + Integer adminId = admin.getId(); + //自己创建的肯定能看见,配置的可以看见,系统管理员可以看见 + SysRole sysRole = sysRoleRepository.findSysRoleById(roleId); + if(SysRole.ROLE_TYPE_SYSTEM != sysRole.getType()){ + queryHelper.addCondition("(p.creator_id=? OR p.approve_id=? OR p.id in (SELECT pv1.project_id FROM project_visible pv1 WHERE pv1.type=1 AND pv1.tid=? UNION SELECT pv2.project_id FROM project_visible pv2 WHERE pv2.type=2 AND pv2.tid=?))", adminId, adminId, roleId, adminId); + } + + queryHelper.addDescOrderProperty("p.last_update_time"); + + return queryHelper; + } + public SpaceVO getListData() { String sql = "SELECT count(id) as sum, certainty, certainty_str as name FROM project WHERE approve_status_estimate >= 1 and approve_status_estimate <= 2 and dept_name = '销售管理部' GROUP BY certainty"; diff --git a/src/main/resources/templates/admin/project_list.ftl b/src/main/resources/templates/admin/project_list.ftl index a669813..889f958 100644 --- a/src/main/resources/templates/admin/project_list.ftl +++ b/src/main/resources/templates/admin/project_list.ftl @@ -381,6 +381,76 @@ + +
+ +
+
+
汇智产品金额
+
+
+ + +
+
+
+ + +
+
+
+
+
华智产品金额
+
+
+ + +
+
+
+ + +
+
+
+
+
华三产品金额
+
+
+ + +
+
+
+ + +
+
+
+
+
其他产品金额
+
+
+ + +
+
+
+ + +
+
+
+
+