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