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 1a856bd..3b9f882 100644 --- a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java +++ b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java @@ -1032,6 +1032,14 @@ public class ProjectController extends BaseController { public ResponseMsg deleteProject(@PathVariable int id) { return projectService.deleteProject(id); } + /** + * 删除草稿状态下的概算项目 + */ + @GetMapping("/delete/{id}") + @ResponseBody + public ResponseMsg deleteLogic(@PathVariable int id) { + return projectService.deleteLogic(id); + } @InitBinder public void initBinder(WebDataBinder webDataBinder) { diff --git a/src/main/java/cn/palmte/work/model/ProjectRepository.java b/src/main/java/cn/palmte/work/model/ProjectRepository.java index b2229ff..21442cc 100644 --- a/src/main/java/cn/palmte/work/model/ProjectRepository.java +++ b/src/main/java/cn/palmte/work/model/ProjectRepository.java @@ -47,5 +47,8 @@ public interface ProjectRepository extends JpaRepository { " and (`project_no` like concat('%', :q, '%') or `name` like concat('%', :q, '%'))", nativeQuery = true) List findBudgetPassedProjects(@Param("q") String query); - + @Modifying + @Transactional(rollbackOn = Exception.class) + @Query(value = "update project set deleted=1 where id = ?", nativeQuery = true) + void deleteLogic(int id); } diff --git a/src/main/java/cn/palmte/work/service/ActProcInsService.java b/src/main/java/cn/palmte/work/service/ActProcInsService.java index 27c26c4..477dd76 100644 --- a/src/main/java/cn/palmte/work/service/ActProcInsService.java +++ b/src/main/java/cn/palmte/work/service/ActProcInsService.java @@ -24,6 +24,7 @@ import org.activiti.engine.impl.identity.Authentication; import org.activiti.engine.repository.ProcessDefinition; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -358,4 +359,9 @@ public class ActProcInsService { } return flowIdList; } + public ProcessInstance getProcInsByBusinessKey(String businessKey) { + List list = runtimeService.createProcessInstanceQuery().processInstanceBusinessKey(businessKey).list(); + list.sort(Comparator.comparing(ProcessInstance::getStartTime).reversed()); + return CollectionUtils.isNotEmpty(list) ? list.get(0) : null; + } } diff --git a/src/main/java/cn/palmte/work/service/ProjectService.java b/src/main/java/cn/palmte/work/service/ProjectService.java index d826b4a..1b0b856 100644 --- a/src/main/java/cn/palmte/work/service/ProjectService.java +++ b/src/main/java/cn/palmte/work/service/ProjectService.java @@ -8,6 +8,8 @@ import cn.palmte.work.pojo.ProjectExportDto; import cn.palmte.work.utils.InterfaceUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import org.activiti.engine.RuntimeService; +import org.activiti.engine.runtime.ProcessInstance; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; @@ -60,7 +62,8 @@ public class ProjectService { private ProjectTaskRecordRepository projectTaskRecordRepository; @Autowired private ProjectTaskRecordService projectTaskRecordService; - + @Autowired + private ActProcInsService actProcInsService; private QueryHelper getQueryHelper(Map searchInfo) { /*"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," + @@ -73,6 +76,7 @@ public class ProjectService { ", FORMAT(pe.gross_profit,2) as grossProfitRound2, FORMAT(pe.gross_profit_margin,2) as grossProfitMarginRound2, FORMAT(pe.advance_interest_amount,2) as advanceInterestAmountRound2, FORMAT(pe.advance_peak_amount,2) as advancePeakAmountRound2" + ", DATE_FORMAT(p.start_date, '%Y-%m-%d') as startDateStr, DATE_FORMAT(p.end_date, '%Y-%m-%d') as endDateStr, DATE_FORMAT(p.last_update_time, '%Y-%m-%d') as lastUpdateTimeStr, DATE_FORMAT(p.contract_time, '%Y-%m-%d') as contractTimeStr, DATE_FORMAT(p.bids_time, '%Y-%m-%d') as bidsTimeStr","project","p"); queryHelper.leftJoin("project_extend pe", "p.id = pe.project_id"); + queryHelper.addCondition("p.deleted=0 "); if(StrUtil.isNotEmpty(searchInfo.get("status")) && !"-1".equals(searchInfo.get("status"))){ queryHelper.addCondition("p.status=?", Integer.parseInt(searchInfo.get("status"))); } @@ -1048,4 +1052,18 @@ public class ProjectService { List projectIds = projectVisibleRepository.findProjectIdByTypeAndTid(ProjectVisible.TYPE_USER, admin.getId()); return projectList.stream().filter(i -> i.getCreatorId() == admin.getId() || projectIds.contains(i.getId())).collect(Collectors.toList()); } + + public ResponseMsg deleteLogic(int id) { + Project one = projectRepository.findOne(id); + if (one == null) { + return ResponseMsg.buildFailedMsg("项目不存在"); + } + + + + projectRepository.deleteLogic(id); + ProcessInstance processInstance = actProcInsService.getProcInsByBusinessKey(String.valueOf(id)); + actProcInsService.deleteProcessInstance(processInstance.getId(), "项目决算"); + return ResponseMsg.buildSuccessMsg("決算成功"); + } } diff --git a/src/main/resources/templates/admin/project_list.ftl b/src/main/resources/templates/admin/project_list.ftl index 67a6753..054e018 100644 --- a/src/main/resources/templates/admin/project_list.ftl +++ b/src/main/resources/templates/admin/project_list.ftl @@ -1079,6 +1079,15 @@ class="am-icon-pencil-square-o">填写预算表 + <@shiro.hasPermission name="PROJECT_FINAL_ACCOUNTS"> + <#if list.status!=15> + + + <#-- --> <#-- 项目等于预算状态、预算审核等于通过状态 --> @@ -1455,6 +1464,24 @@ layer.alert("请先填写预算表中的合同名称,再填写结算表"); } } + function deleteLogicProject(id,projectNo,name){ + let title='请确认'+projectNo+'('+name+')是否决算?' + layer.confirm(title,()=>{ + $.ajax({ + url: '${base}/' + id, + dataType: "json", + async: false, + success: function (data) { + if (data.status == 0) { + layer.alert(data.msg); + window.location.href = window.location.href; + } else if (data.status == 1) { + layer.alert(data.msg); + } + } + }); + }) + } function checkContractName2(id, isContract) { if (isContract === 1) {