Browse Source

feat:

1. 初验待办统计、列表查询逻辑修改;
tags/25012001
WendyYang 2 months ago
parent
commit
0babd1589e
4 changed files with 56 additions and 59 deletions
  1. +51
    -58
      hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/manage/ConstructionManage.java
  2. +3
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/vo/FirstAcceptProgressVO.java
  3. +1
    -1
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/ProjectManageTodoCountManage.java
  4. +1
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/enumeration/status/ProjectStatus.java

+ 51
- 58
hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/manage/ConstructionManage.java View File

@@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -14,6 +15,7 @@ import com.hz.pm.api.common.exception.ReturnException;
import com.hz.pm.api.common.helper.UserInfoHelper;
import com.hz.pm.api.common.model.constant.BizConst;
import com.hz.pm.api.common.model.constant.ExistsSqlConst;
import com.hz.pm.api.common.statemachine.event.ProjectStateChangeEvent;
import com.hz.pm.api.common.statemachine.event.TenderStateChangeEvent;
import com.hz.pm.api.common.statemachine.util.ProjectStateMachineUtil;
import com.hz.pm.api.common.statemachine.util.TenderStateMachineUtil;
@@ -31,13 +33,13 @@ import com.hz.pm.api.projectdeclared.model.enumerization.BidTypeEnum;
import com.hz.pm.api.projectdeclared.model.req.XcfhxApplyReq;
import com.hz.pm.api.projectdeclared.model.vo.*;
import com.hz.pm.api.projectdeclared.service.*;
import com.hz.pm.api.projectlib.entity.PurchaseStatusChange;
import com.hz.pm.api.projectlib.helper.ProjectManageUtil;
import com.hz.pm.api.projectlib.model.constant.ProjectStatusConstant;
import com.hz.pm.api.projectlib.model.entity.Project;
import com.hz.pm.api.projectlib.model.entity.ProjectAnnualPaymentPlan;
import com.hz.pm.api.projectlib.model.entity.ProjectInst;
import com.hz.pm.api.projectlib.model.enumeration.ProjectTypeNewEnum;
import com.hz.pm.api.projectlib.model.enumeration.status.ITenderStatus;
import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus;
import com.hz.pm.api.projectlib.model.enumeration.status.TenderMainStatus;
import com.hz.pm.api.projectlib.model.enumeration.status.TenderXcfhxApplyStatus;
@@ -47,6 +49,7 @@ import com.hz.pm.api.projectlib.model.vo.TenderListInfoVO;
import com.hz.pm.api.projectlib.service.IProjectAnnualPaymentPlanService;
import com.hz.pm.api.projectlib.service.IProjectInstService;
import com.hz.pm.api.projectlib.service.IProjectService;
import com.hz.pm.api.projectlib.service.IPurchaseStatusChangeService;
import com.hz.pm.api.scheduler.listener.event.MhTodoHandedEvent;
import com.hz.pm.api.scheduler.listener.event.MhTodoSendEvent;
import com.hz.pm.api.sys.manage.ProcessModelManage;
@@ -67,7 +70,6 @@ import com.wflow.workflow.bean.vo.ProcessStartParamsVo;
import com.wflow.workflow.service.ProcessInstanceService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.TaskService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@@ -78,7 +80,6 @@ import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.BiFunction;
import java.util.stream.Collectors;

/**
@@ -109,8 +110,7 @@ public class ConstructionManage {
private final XcfhxStateMachineUtil xcfhxStateMachineUtil;
private final MhXcfhxReportHelper mhXcfhxReportHelper;
private final IXinchuangService xinchuangService;

private final TaskService taskService;
private final IPurchaseStatusChangeService purchaseStatusChangeService;

private final IXinchuangInstService xinchuangInstService;
private final MhUnitQueryAuthHelper mhUnitQueryAuthHelper;
@@ -122,7 +122,7 @@ public class ConstructionManage {
* @return \
*/
public PageVo<ProjectLibListItemVO> projectLibList(ProjectListReq req) {
UserInfoDetails user = LoginUserUtil.userDetail();
UserInfoDetails user = LoginUserUtil.userDetailNotNull();
LambdaQueryWrapper<Project> query = ProjectManageUtil.projectQuery(req);
//建设中状态
query.isNull(Project::getContractAmount);
@@ -315,10 +315,8 @@ public class ConstructionManage {
.eq(Project::getNewest, Boolean.TRUE)
.ne(Project::getStage, ProjectStatus.STOPPED.getCode())
.notIn(Project::getStatus, ProjectStatusConstant.CHANGE_DELETE_PASSED)
.and(q1 -> q1.exists(ExistsSqlConst.PROJECT_EXISTS_PURCHASE
+ " and np.status = {0} ", TenderMainStatus.TO_BE_SUBMIT_FIRST_INSPECTED_INFO.getCode())
.or(q2 -> q2.exists(ExistsSqlConst.PROJECT_EXISTS_PURCHASE_STATUS_CHANGE
+ " and npsc.event = {0}", TenderStateChangeEvent.SUBMIT_FIRST_INSPECTED_FILES)));
.exists(ExistsSqlConst.PROJECT_EXISTS_PURCHASE_STATUS_CHANGE
+ " and npsc.event = {0}", TenderStateChangeEvent.SUBMIT_PURCHASE_ORG_CONFIRM);
if (CollUtil.isNotEmpty(queryState.getUnitIds())) {
query.in(Project::getBuildOrgCode, CollUtils.convert(queryState.getUnitIds(), String::valueOf));
}
@@ -327,30 +325,38 @@ public class ConstructionManage {
return null;
}
List<Long> projectIds = CollUtils.fieldList(projects, Project::getId);
LambdaQueryWrapper<Purchase> purchaseQuery = Wrappers.lambdaQuery(Purchase.class)
.select(Purchase::getStatus, Purchase::getProjectId)
.in(Purchase::getProjectId, projectIds)
.and(q1 -> q1.eq(Purchase::getStatus, TenderMainStatus.TO_BE_SUBMIT_FIRST_INSPECTED_INFO.getCode())
.or(q2 -> q2.exists(ExistsSqlConst.PURCHASE_EXISTS_STATUS_CHANGE
+ " and npsc.event = {0}", TenderStateChangeEvent.SUBMIT_FIRST_INSPECTED_FILES)));
Wrapper<Purchase> purchaseQuery = Wrappers.lambdaQuery(Purchase.class)
.select(Purchase::getId, Purchase::getProjectId)
.eq(Purchase::getBidType, BidTypeEnum.BUILD_APP.getCode())
.in(Purchase::getProjectId, projectIds);
List<Purchase> purchases = purchaseService.list(purchaseQuery);
Map<Long, List<ITenderStatus>> purchaseMap = purchases.stream()
List<Long> bidIds = new ArrayList<>();
Map<Long, List<Long>> projectPurchaseMap = purchases.stream()
.collect(Collectors.groupingBy(Purchase::getProjectId,
Collectors.mapping(w -> {
if (TenderMainStatus.TO_BE_SUBMIT_FIRST_INSPECTED_INFO.eq(w.getStatus())) {
return TenderMainStatus.TO_BE_SUBMIT_FIRST_INSPECTED_INFO;
} else {
return TenderMainStatus.SUBMITTED_FIRST_INSPECTED_INFO;
}
Long bidId = w.getId();
bidIds.add(bidId);
return bidId;
}, Collectors.toList())));
BiFunction<Map<Long, List<ITenderStatus>>, ITenderStatus, Integer> counter = (p, s) -> {
Collection<List<ITenderStatus>> values = purchaseMap.values();
return CollUtil.count(values, x -> CollUtil.anyMatch(x, w -> w.eq(s)));
};
Map<Long, PurchaseStatusChange> purchaseStatusChangeMap = purchaseStatusChangeService.listLastOne(bidIds,
TenderStateChangeEvent.SUBMIT_FIRST_INSPECTED_FILES);

Map<ProjectStatus, Long> statusCountMap = CollUtils.groupCount(projectIds, w -> {
List<Long> tmpBidIds = projectPurchaseMap.get(w);
int finishCount = CollUtil.count(tmpBidIds, w1 -> purchaseStatusChangeMap.get(w1) != null);
if (finishCount == 0) {
return ProjectStatus.TO_BE_FIRST_INSPECTED;
} else if (finishCount == tmpBidIds.size()) {
return ProjectStatus.ON_PILOT_RUNNING;
} else {
return ProjectStatus.ON_FIRST_INSPECTING;
}
});
FirstAcceptProgressVO stat = new FirstAcceptProgressVO();
stat.setTotalCount(projectIds.size());
stat.setPassedCount(counter.apply(purchaseMap, TenderMainStatus.SUBMITTED_FIRST_INSPECTED_INFO));
stat.setTodoCount(counter.apply(purchaseMap, TenderMainStatus.TO_BE_SUBMIT_FIRST_INSPECTED_INFO));
stat.setDoingCount(statusCountMap.getOrDefault(ProjectStatus.ON_FIRST_INSPECTING, 0L).intValue());
stat.setPassedCount(statusCountMap.getOrDefault(ProjectStatus.ON_PILOT_RUNNING, 0L).intValue());
stat.setTodoCount(statusCountMap.getOrDefault(ProjectStatus.TO_BE_FIRST_INSPECTED, 0L).intValue());
return stat;
}

@@ -367,23 +373,29 @@ public class ConstructionManage {
if (!queryState.isState()) {
return PageVo.empty();
}
String existsSql = String.format(ExistsSqlConst.PROJECT_EXISTS_PURCHASE_STATUS_CHANGE
+ " and npsc.event = '%s'", TenderStateChangeEvent.SUBMIT_FIRST_INSPECTED_FILES);
LambdaQueryWrapper<Project> query = ProjectManageUtil.projectQuery(req)
.ne(Project::getStage, ProjectStatus.STOPPED.getCode())
.notIn(Project::getStatus, ProjectStatusConstant.CHANGE_DELETE_PASSED)
.eq(Project::getNewest, Boolean.TRUE)
.orderByAsc(Project::getDeliveryTime);
if (req.getTabStatus() != null) {
if (TenderMainStatus.TO_BE_SUBMIT_FIRST_INSPECTED_INFO.eq(req.getTabStatus())) {
query.exists(ExistsSqlConst.PROJECT_EXISTS_PURCHASE + " and np.status = {0} ", req.getTabStatus());
String existsSql = String.format(ExistsSqlConst.PROJECT_EXISTS_PURCHASE_STATUS_CHANGE
+ " and npsc.event = '%s'", TenderStateChangeEvent.SUBMIT_FIRST_INSPECTED_FILES);
if (ProjectStatus.TO_BE_FIRST_INSPECTED.eq(req.getTabStatus())) {
query.exists(ExistsSqlConst.PROJECT_EXISTS_STATUS_CHANGE + " and npsc.event = {0}",
ProjectStateChangeEvent.SUBMIT_PURCHASE_ORG_CONFIRM)
.notExists(existsSql);
} else if (ProjectStatus.ON_FIRST_INSPECTING.eq(req.getTabStatus())) {
query.exists(existsSql)
.notExists(ExistsSqlConst.PROJECT_EXISTS_STATUS_CHANGE + " and npsc.event = {0}",
ProjectStateChangeEvent.SUBMIT_FIRST_INSPECTED_FILES);
} else {
query.exists(existsSql);
query.exists(ExistsSqlConst.PROJECT_EXISTS_STATUS_CHANGE + " and npsc.event = {0}",
ProjectStateChangeEvent.SUBMIT_FIRST_INSPECTED_FILES);
}
} else {
query.and(q1 -> q1.exists(ExistsSqlConst.PROJECT_EXISTS_PURCHASE +
" and np.status = {0} ", TenderMainStatus.TO_BE_SUBMIT_FIRST_INSPECTED_INFO.getCode())
.or(q2 -> q2.exists(existsSql)));
query.exists(ExistsSqlConst.PROJECT_EXISTS_PURCHASE_STATUS_CHANGE
+ " and npsc.event = {0}", TenderStateChangeEvent.SUBMIT_PURCHASE_ORG_CONFIRM);
}
if (CollUtil.isNotEmpty(queryState.getUnitIds())) {
query.in(Project::getBuildOrgCode, CollUtils.convert(queryState.getUnitIds(), String::valueOf));
@@ -393,21 +405,7 @@ public class ConstructionManage {
return PageVo.empty();
}
List<Long> projectIds = CollUtils.fieldList(page.getRecords(), Project::getId);
LambdaQueryWrapper<Purchase> purchaseQuery = Wrappers.lambdaQuery(Purchase.class)
.in(Purchase::getProjectId, projectIds);
if (req.getTabStatus() != null) {
if (TenderMainStatus.TO_BE_SUBMIT_FIRST_INSPECTED_INFO.eq(req.getTabStatus())) {
purchaseQuery.eq(Purchase::getStatus, req.getTabStatus());
} else {
purchaseQuery.exists(ExistsSqlConst.PURCHASE_EXISTS_STATUS_CHANGE
+ " and npsc.event = {0}", TenderStateChangeEvent.SUBMIT_FIRST_INSPECTED_FILES);
}
} else {
purchaseQuery.and(q1 -> q1.eq(Purchase::getStatus, TenderMainStatus.TO_BE_SUBMIT_FIRST_INSPECTED_INFO.getCode())
.or(q2 -> q2.exists(ExistsSqlConst.PURCHASE_EXISTS_STATUS_CHANGE
+ " and npsc.event = {0}", TenderStateChangeEvent.SUBMIT_FIRST_INSPECTED_FILES)));
}
List<Purchase> purchases = purchaseService.list(purchaseQuery);
List<Purchase> purchases = purchaseService.listByProjectIds(projectIds);
Map<Long, List<Purchase>> purchaseMap = CollUtils.group(purchases, Purchase::getProjectId);
Map<Long, Contract> contractMap = contractService.listByProjectIds(projectIds);

@@ -443,13 +441,8 @@ public class ConstructionManage {
if (contract != null) {
tender.setConstructionAmount(contract.getTotalAmount());
}
if (!TenderMainStatus.TO_BE_SUBMIT_FIRST_INSPECTED_INFO.eq(x.getStatus())) {
tender.setBidStatus(TenderMainStatus.SUBMITTED_FIRST_INSPECTED_INFO.getCode());
tender.setBidStatusName(TenderMainStatus.SUBMITTED_FIRST_INSPECTED_INFO.getDesc());
} else {
tender.setBidStatus(x.getStatus());
tender.setBidStatusName(TenderMainStatus.getDesc(x.getStatus()));
}
tender.setBidStatus(x.getStatus());
tender.setBidStatusName(TenderMainStatus.getDesc(x.getStatus()));
return tender;
});
item.setTenders(tmpPurchases);


+ 3
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/vo/FirstAcceptProgressVO.java View File

@@ -20,6 +20,9 @@ public class FirstAcceptProgressVO {
@ApiModelProperty("待初验数量")
private Integer todoCount;

@ApiModelProperty("初验中数量")
private Integer doingCount;

@ApiModelProperty("已初验数量")
private Integer passedCount;



+ 1
- 1
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/ProjectManageTodoCountManage.java View File

@@ -99,7 +99,7 @@ public class ProjectManageTodoCountManage {
// 项目初验
projReqOrg.setBuildOrgCode(req.getBuildOrgCode());
FirstAcceptProgressVO firstAccept = constructionManage.firstAcceptProgress(projReqOrg);
ret.setFirstAccept(sum(firstAccept, FirstAcceptProgressVO::getTodoCount));
ret.setFirstAccept(sum(firstAccept, FirstAcceptProgressVO::getTodoCount, FirstAcceptProgressVO::getDoingCount));
// 项目终验
projReqOrg.setBuildOrgCode(req.getBuildOrgCode());
FinalAcceptProgressVO finalAccept = finalAcceptanceManage.finalAcceptProgress(projReqOrg);


+ 1
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/enumeration/status/ProjectStatus.java View File

@@ -72,6 +72,7 @@ public enum ProjectStatus implements IStatus<Integer, String> {
FINISH_ADAPT(20012, "适配改造完成", 20000),

TO_BE_FIRST_INSPECTED(20008, "待上传初验材料", 20000),
ON_FIRST_INSPECTING(20013, "初验中", 20000),
ON_PILOT_RUNNING(20009, "试运行中", 20000),

ON_FINALLY_INSPECTED(20004, "终验审核中", 20000),


Loading…
Cancel
Save