feat(project): 添加项目决算功能

- 在项目列表页面添加决算按钮
- 实现项目决算的逻辑,包括更新项目状态和删除相关流程实例
- 新增获取流程实例的方法
dev_2.0.4
chenhao 2025-09-09 15:24:19 +08:00
parent d02ce1738d
commit 0eb8d1563d
5 changed files with 64 additions and 2 deletions

View File

@ -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) {

View File

@ -47,5 +47,8 @@ public interface ProjectRepository extends JpaRepository<Project,Integer> {
" and (`project_no` like concat('%', :q, '%') or `name` like concat('%', :q, '%'))",
nativeQuery = true)
List<Project> 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);
}

View File

@ -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<ProcessInstance> list = runtimeService.createProcessInstanceQuery().processInstanceBusinessKey(businessKey).list();
list.sort(Comparator.comparing(ProcessInstance::getStartTime).reversed());
return CollectionUtils.isNotEmpty(list) ? list.get(0) : null;
}
}

View File

@ -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<String, String> 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<Integer> 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("決算成功");
}
}

View File

@ -1079,6 +1079,15 @@
class="am-icon-pencil-square-o"></span>填写预算表
</button>
</#if>
<@shiro.hasPermission name="PROJECT_FINAL_ACCOUNTS">
<#if list.status!=15>
<button type="button"
class="am-btn am-btn-default am-btn-xs am-text-secondary"
onclick="deleteLogicProject('${list.id}','${list.projectNo}','${list.name}')"><span
class="am-icon-pencil-square-o"></span>決算
</button>
</#if>
</@shiro.hasPermission>
<#-- </@shiro.hasPermission>-->
<#-- 项目等于预算状态、预算审核等于通过状态 -->
@ -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) {