package cn.palmte.work.service; import cn.palmte.work.bean.*; import cn.palmte.work.model.Admin; import cn.palmte.work.model.Project; import cn.palmte.work.model.ProjectRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import top.jfunc.common.db.QueryHelper; import top.jfunc.common.db.bean.Page; import top.jfunc.common.db.utils.Pagination; import top.jfunc.common.utils.CollectionUtil; import top.jfunc.common.utils.StrUtil; import java.util.Date; import java.util.List; import java.util.Map; /** * @author xiongshiyan at 2021/10/29 , contact me with email yanshixiong@126.com or phone 15208384257 */ @Service public class ProjectService { @Autowired private Pagination pagination; @Autowired private ProjectRepository projectRepository; @Autowired private ProjectEstimateService projectEstimateService; @Autowired private ProjectBudgetService projectBudgetService; @Autowired private ProjectInstanceService projectInstanceService; @Autowired private ActTaskDefService actTaskDefService; private QueryHelper getQueryHelper(Map searchInfo, int pageNumber, int pageSize) { /*"CASE p.type WHEN 1 THEN '工程集成类' WHEN 2 THEN '设备集成类' WHEN 3 THEN '战略合作类' ELSE '未知' AS typeDesc," + "CASE p.status WHEN 0 THEN '草稿' WHEN 1 THEN '项目创建' WHEN 5 THEN '概算完成' WHEN 10 THEN '预算完成' WHEN 15 THEN '结算中' WHEN 20 THEN '决算完成' ELSE '未知' AS statusDesc," + "CASE p.approve_status WHEN 0 THEN '待审核' WHEN 1 THEN '审核通过' WHEN 2 THEN '审核不通过' ELSE '未知' AS approveStatusDesc," + */ QueryHelper queryHelper = new QueryHelper("SELECT p.*","project","p"); if(StrUtil.isNotEmpty(searchInfo.get("status")) && !"-1".equals(searchInfo.get("status"))){ queryHelper.addCondition("p.status=?", Integer.parseInt(searchInfo.get("status"))); } if(StrUtil.isNotEmpty(searchInfo.get("approveId"))){ int approveId = Integer.parseInt(searchInfo.get("approveId")); queryHelper.addCondition("p.approve_id=?", approveId); } if(StrUtil.isNotEmpty(searchInfo.get("approveStatus")) && !"-1".equals(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"))); } 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("name")),"p.name LIKE ?", "%"+searchInfo.get("name")+"%"); queryHelper.addCondition(StrUtil.isNotEmpty(searchInfo.get("creatorName")),"p.creator_name LIKE ?", "%"+searchInfo.get("creatorName")+"%"); /** * 只选择了一个时间的情况,就项目时间包括这个时间的 */ 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("startUpdateDate"))){ String time = searchInfo.get("startUpdateDate") + " 00:00:00"; queryHelper.addCondition("p.last_update_time>=?", time); } if(StrUtil.isNotEmpty(searchInfo.get("endUpdateDate"))){ String time = searchInfo.get("endUpdateDate") + " 00:00:00"; queryHelper.addCondition("p.last_update_time<=?", time); } return queryHelper; } public Page list(Map searchInfo, int pageNumber, int pageSize){ QueryHelper queryHelper = getQueryHelper(searchInfo, pageNumber, pageSize); return pagination.paginate(queryHelper.getSql(), Project.class,pageNumber,pageSize); } /** * 找到待我审核项目 */ public Page findMyApproveProjects(Map searchInfo, int adminId, int pageNumber, int pageSize){ //在列表基础上增加审核人是我和待审核状态的条件 searchInfo.put("approveId", ""+ adminId); searchInfo.put("approveStatus", ""+ApproveStatusEnum.APPROVAL_PENDING.getApproveStatus()); return list(searchInfo, pageNumber, pageSize); } public Project getProject(int id){ return projectRepository.findOne(id); } /** * 新增概算保存项目并发起审核 */ @Transactional(rollbackFor = RuntimeException.class) public Project estimateAddSaveAndApprove(Project project, EstimateBean estimateBean, Admin admin) throws Exception { Project p = estimateAddSave(project, estimateBean, admin, ApproveStatusEnum.APPROVAL_PENDING); projectInstanceService.startEstimateProcessInstance(p, admin); return project; } /** * 新增概算保存项目 */ @Transactional(rollbackFor = RuntimeException.class) public Project estimateAddSave(Project project, EstimateBean estimateBean, Admin admin, ApproveStatusEnum approveStatusEnum) { Project p = addProject(project, admin, approveStatusEnum); projectEstimateService.saveEstimate(p, estimateBean); return project; } /** * 编辑概算保存项目并发起审核 */ @Transactional(rollbackFor = RuntimeException.class) public Project estimateEditSaveAndApprove(Project project, EstimateBean estimateBean, Admin admin) throws Exception { Project p = estimateEditSave(project, estimateBean, admin, ApproveStatusEnum.APPROVAL_PENDING); if(null != p.getApproveStatusEstimate() && ApproveStatusEnum.APPROVAL_UNPASS.getApproveStatus() == p.getApproveStatusEstimate()){ //审核不通过的情况下重新编辑后就完成当前任务【此时任务节点在第一个,也就是发起审批】 List estimateProcessInsIds = projectInstanceService.getEstimateProcessInsIds(p); if(CollectionUtil.isNotEmpty(estimateProcessInsIds)){ actTaskDefService.completeTaskByProcInsId(estimateProcessInsIds.get(0), ApproveStatusEnum.APPROVAL_PASSED.getApproveStatus(), "重新修改了概算表,请审批"); } }else { //第一次或者重新发起一个流程实例【第一次或者以前的审批都已经过了】 projectInstanceService.startEstimateProcessInstance(p, admin); } return p; } /** * 编辑概算保存项目 */ @Transactional(rollbackFor = RuntimeException.class) public Project estimateEditSave(Project project, EstimateBean estimateBean, Admin admin, ApproveStatusEnum approveStatusEnum) { Project p = editProject(project, admin, approveStatusEnum); p.setStatus(StatusEnum.CREATED.getStatus()); p.setStatusDesc(StatusEnum.CREATED.getStatusDesc()); p.setApproveStatusEstimate(approveStatusEnum.getApproveStatus()); ProjectConfigBean projectConfigBeanConfig = projectBudgetService.getProjectConfigBeanConfig(); project.setProjectContributionProfitRateThreshold(projectConfigBeanConfig.getProjectContributionProfitRateThreshold()); project.setUnderwrittenTaxRate(projectConfigBeanConfig.getUnderwrittenTaxRate()); p = projectRepository.saveAndFlush(p); //清空重新保存概算信息 projectEstimateService.clearEstimate(p); projectEstimateService.saveEstimate(p, estimateBean); return p; } private Project addProject(Project project, Admin admin, ApproveStatusEnum approveStatusEnum) { project.setTypeDesc(TypeEnum.parseType(project.getType()).getTypeDesc()); project.setStatus(StatusEnum.CREATED.getStatus()); project.setStatusDesc(StatusEnum.CREATED.getStatusDesc()); project.setApproveStatusEstimate(approveStatusEnum.getApproveStatus()); project.setCreatorId(admin.getId()); project.setCreatorName(admin.getUserName()); ProjectConfigBean projectConfigBeanConfig = projectBudgetService.getProjectConfigBeanConfig(); project.setProjectContributionProfitRateThreshold(projectConfigBeanConfig.getProjectContributionProfitRateThreshold()); project.setUnderwrittenTaxRate(projectConfigBeanConfig.getUnderwrittenTaxRate()); project.setApproveId(null); project.setApproveName(""); //TODO 获取登录人的部门信息 project.setDeptId(admin.getId()); project.setDeptName("工程部"); Date now = new Date(); project.setCreateTime(now); project.setLastUpdateTime(now); project = projectRepository.saveAndFlush(project); return project; } private Project editProject(Project project, Admin admin, ApproveStatusEnum approveStatusEnum) { Project p = getProject(project.getId()); //只有如下可以修改 p.setStartDate(project.getStartDate()); p.setEndDate(project.getEndDate()); p.setAdvanceInterestAmount(project.getAdvanceInterestAmount()); p.setAdvancePeakAmount(project.getAdvancePeakAmount()); p.setContractAmount(project.getContractAmount()); p.setHuazhiProductAmount(project.getHuazhiProductAmount()); p.setZiguangOtherAmount(project.getZiguangOtherAmount()); p.setMainContractCollectionTerms(project.getMainContractCollectionTerms()); p.setApproveStatusEstimate(approveStatusEnum.getApproveStatus()); p.setLastUpdateTime(new Date()); return p; } /** * 编辑预算保存项目并审核 */ @Transactional(rollbackFor = RuntimeException.class) public Project budgetEditSaveAndApprove(Project project, BudgetBean budgetBean, Admin admin) throws Exception { Project p = budgetEditSave(project, budgetBean, admin, ApproveStatusEnum.APPROVAL_PENDING); if(null != p.getApproveStatusBudget() && ApproveStatusEnum.APPROVAL_UNPASS.getApproveStatus() == p.getApproveStatusBudget()){ //审核不通过的情况下重新编辑后就完成当前任务 List budgetProcessInsIds = projectInstanceService.getBudgetProcessInsIds(p); if(CollectionUtil.isNotEmpty(budgetProcessInsIds)){ actTaskDefService.completeTaskByProcInsId(budgetProcessInsIds.get(0), ApproveStatusEnum.APPROVAL_PASSED.getApproveStatus(), "重新修改了预算表,请审批"); } }else { //第一次或者重新发起一个流程实例 projectInstanceService.startBudgetProcessInstance(p, admin); } return p; } /** * 编辑预算保存项目 */ @Transactional(rollbackFor = RuntimeException.class) public Project budgetEditSave(Project project, BudgetBean budgetBean, Admin admin, ApproveStatusEnum approveStatusEnum) { Project p = editProject(project, admin, approveStatusEnum); p.setStatus(StatusEnum.BUDGET_ACCOUNTS.getStatus()); p.setStatusDesc(StatusEnum.BUDGET_ACCOUNTS.getStatusDesc()); p.setApproveStatusEstimate(approveStatusEnum.getApproveStatus()); p = projectRepository.saveAndFlush(p); //清空重新保存概算信息 projectBudgetService.clearBudget(p); projectBudgetService.saveBudget(p, budgetBean); return p; } }