diff --git a/hz-pm-api/pom.xml b/hz-pm-api/pom.xml index ee0c566..6825829 100644 --- a/hz-pm-api/pom.xml +++ b/hz-pm-api/pom.xml @@ -12,6 +12,18 @@ + org.openjdk.jmh + jmh-core + 1.37 + test + + + org.openjdk.jmh + jmh-generator-annprocess + 1.37 + test + + com.google.guava guava 33.0.0-jre diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/common/config/BeanConfig.java b/hz-pm-api/src/main/java/com/hz/pm/api/common/config/BeanConfig.java index 4945c38..65bd1dc 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/common/config/BeanConfig.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/common/config/BeanConfig.java @@ -17,14 +17,12 @@ import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.web.client.RestTemplate; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** @@ -55,7 +53,7 @@ public class BeanConfig { converterList.remove(converterTarget); } HttpMessageConverter converter = new StringHttpMessageConverter(StandardCharsets.UTF_8); - converterList.add(1,converter); + converterList.add(1, converter); MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Arrays.asList( diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/common/handler/CpuLoadTask.java b/hz-pm-api/src/main/java/com/hz/pm/api/common/handler/CpuLoadTask.java index 9dc1bc9..ee69397 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/common/handler/CpuLoadTask.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/common/handler/CpuLoadTask.java @@ -4,8 +4,8 @@ import cn.hutool.core.date.StopWatch; import cn.hutool.core.util.RandomUtil; import cn.hutool.system.oshi.OshiUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; import org.springframework.lang.NonNull; import org.springframework.scheduling.annotation.Scheduled; @@ -25,16 +25,21 @@ import java.util.stream.Stream; * @since 20:30 2024/3/5 */ @Slf4j -@Profile("prod") @Configuration +@ConditionalOnExpression("${cpu-load-task.open:false}") public class CpuLoadTask { - private static final int LIMIT_COUNT = 2000000000; - private final AtomicInteger taskNo = new AtomicInteger(0); + public CpuLoadTask() { + CpuLoadThreadFactory threadFactory = new CpuLoadThreadFactory(Thread.MIN_PRIORITY); + fixedThreadPool = Executors.newFixedThreadPool(1, threadFactory); + } + + private final ExecutorService fixedThreadPool; private static final Integer CPU_LIMIT = 20; + private static final int LIMIT_COUNT = 1000000000; + private final AtomicInteger taskNo = new AtomicInteger(0); - private static final ExecutorService FIXED_THREAD_POOL; private static class CpuLoadThreadFactory implements ThreadFactory { @@ -53,13 +58,6 @@ public class CpuLoadTask { } - static { - int logicalProcessorCount = OshiUtil.getProcessor().getLogicalProcessorCount(); - int max = Math.max(logicalProcessorCount * CPU_LIMIT / 100, 1); - CpuLoadThreadFactory threadFactory = new CpuLoadThreadFactory(Thread.MIN_PRIORITY); - FIXED_THREAD_POOL = Executors.newFixedThreadPool(max, threadFactory); - } - @Scheduled(fixedRate = 1, timeUnit = TimeUnit.MINUTES) public void run() { @@ -67,7 +65,7 @@ public class CpuLoadTask { log.info("当前CPU使用率:{}", cpuUsage); if (cpuUsage < CPU_LIMIT) { log.info("提交计算任务:{}", taskNo.incrementAndGet()); - FIXED_THREAD_POOL.execute(() -> { + fixedThreadPool.execute(() -> { StopWatch watch = new StopWatch(); watch.start(); long sum = Stream.generate(() -> RandomUtil.randomLong(1, LIMIT_COUNT)) diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/common/helper/impl/UserInfoHelperImpl.java b/hz-pm-api/src/main/java/com/hz/pm/api/common/helper/impl/UserInfoHelperImpl.java index fd9498f..b4c6b6b 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/common/helper/impl/UserInfoHelperImpl.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/common/helper/impl/UserInfoHelperImpl.java @@ -6,11 +6,14 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; 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.MhUnitConst; import com.hz.pm.api.common.util.StrUtils; import com.hz.pm.api.sys.mapper.RoleMapper; import com.hz.pm.api.sys.model.entity.Role; import com.hz.pm.api.sys.model.entity.UserRole; import com.hz.pm.api.sys.service.IUserRoleService; +import com.hz.pm.api.user.helper.MhUnitCache; +import com.hz.pm.api.user.model.dto.UnitDTO; import com.hz.pm.api.user.model.entity.UserInfo; import com.hz.pm.api.user.model.enumeration.RoleEnum; import com.hz.pm.api.user.model.enumeration.UserAvailableEnum; @@ -38,6 +41,7 @@ public class UserInfoHelperImpl implements UserInfoHelper { private final IUserInfoService userInfoService; private final IUserRoleService iUserRoleService; private final RoleMapper roleMapper; + private final MhUnitCache mhUnitCache; @Override public UserFullInfoDTO getUserFullInfoByMhUserIdOrOpenId(String mhUserId) { @@ -73,6 +77,28 @@ public class UserInfoHelperImpl implements UserInfoHelper { .collect(Collectors.toList()); userFullInfo.setUserRoleList(roleMapper.selectBatchIds(roleIdList)); } + UnitDTO unit = mhUnitCache.getById(userInfo.getMhUnitId()); + if (unit != null && unit.getType() != null) { + userFullInfo.setUnitStrip(unit.getType().getStrip().getCode()); + // 是否市属国有企业下用户 + List citySoeUnitIds = mhUnitCache.getViewChildIdsRecursion(MhUnitConst.CITY_SOE_UNIT_ID); + userFullInfo.setIsCitySoeUser(citySoeUnitIds.contains(userInfo.getMhUnitId())); + if (!userFullInfo.getIsCitySoeUser()) { + // 是否关键行业部门下用户 + List keyIndustryUnitIds = mhUnitCache.getViewChildIdsRecursion(MhUnitConst.KEY_INDUSTRY_UNIT_ID); + userFullInfo.setIsKeyIndustryUser(keyIndustryUnitIds.contains(userInfo.getMhUnitId())); + if (!userFullInfo.getIsKeyIndustryUser()) { + // 是否区县部门下用户 + List countyUnitIds = mhUnitCache.getViewChildIdsRecursion(MhUnitConst.COUNTY_PARENT_UNIT_ID); + userFullInfo.setIsCountyUser(countyUnitIds.contains(userInfo.getMhUnitId())); + if (!userFullInfo.getIsCountyUser()) { + // 是否市本级用户 + List cityDistrictUnitIds = mhUnitCache.getViewChildIdsRecursion(MhUnitConst.CITY_DISTRICT_UNIT_ID); + userFullInfo.setIsCityDistrictUser(cityDistrictUnitIds.contains(userInfo.getMhUnitId())); + } + } + } + } // 装配返回 userFullInfo.setUserId(userInfo.getId()); @@ -105,7 +131,7 @@ public class UserInfoHelperImpl implements UserInfoHelper { return userInfos.stream().map(this::convert).collect(Collectors.toList()); } - private UserFullInfoDTO convert(UserInfo userInfo){ + private UserFullInfoDTO convert(UserInfo userInfo) { UserFullInfoDTO userFullInfo = new UserFullInfoDTO(); // 装配返回 userFullInfo.setMhUnitName(userInfo.getMhUnitName()); @@ -164,7 +190,7 @@ public class UserInfoHelperImpl implements UserInfoHelper { .exists("select 1 from nd_user_role nur where nur.user_id = nd_user_info.id" + " and nur.role_id = {0}", role.getId()); List userInfos = userInfoService.list(query); - return CollUtils.convert(userInfos,this::convert); + return CollUtils.convert(userInfos, this::convert); } @Override diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/common/model/constant/MhUnitConst.java b/hz-pm-api/src/main/java/com/hz/pm/api/common/model/constant/MhUnitConst.java index 7222c3b..006b741 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/common/model/constant/MhUnitConst.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/common/model/constant/MhUnitConst.java @@ -16,6 +16,22 @@ public class MhUnitConst { private MhUnitConst() { } + /** + * 重点行业 + */ + public static final long KEY_INDUSTRY_UNIT_ID = 6788; + + /** + * 市级部门 + */ + public static final long CITY_DISTRICT_UNIT_ID = 970; + /** + * 市属国有企业 + */ + public static final long CITY_SOE_UNIT_ID = 3269; + /** + * 区县部门 + */ public static final long COUNTY_PARENT_UNIT_ID = 1084; public static final long ROOT_UNIT_ID = 1; diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/builder/impl/ProjectStateMachineBuilderImpl.java b/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/builder/impl/ProjectStateMachineBuilderImpl.java index 9b002ab..72386fe 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/builder/impl/ProjectStateMachineBuilderImpl.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/builder/impl/ProjectStateMachineBuilderImpl.java @@ -3,7 +3,7 @@ package com.hz.pm.api.common.statemachine.builder.impl; import com.hz.pm.api.common.statemachine.builder.BaseStateMachineBuilder; import com.hz.pm.api.common.statemachine.event.ProjectStateChangeEvent; import com.hz.pm.api.common.statemachine.factory.ProjectGuardFactory; -import com.hz.pm.api.common.statemachine.factory.ProjectGuardFactory.ProjectPurchaseToFirstAcceptGuard; +import com.hz.pm.api.common.statemachine.factory.ProjectGuardFactory.ProjectPurchaseToAcceptGuard; import com.hz.pm.api.projectlib.model.entity.Project; import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; import lombok.RequiredArgsConstructor; @@ -32,13 +32,15 @@ import java.util.EnumSet; */ @Slf4j @Component -@EnableStateMachine(name = ProjectStateMachineBuilderImpl.MACHINE_ID) @RequiredArgsConstructor +@EnableStateMachine(name = ProjectStateMachineBuilderImpl.MACHINE_ID) public class ProjectStateMachineBuilderImpl implements BaseStateMachineBuilder { public static final String MACHINE_ID = "projectDeclareStateMachine"; private final BeanFactory beanFactory; + private final ProjectPurchaseToAcceptGuard projectPurchaseToAcceptGuard; + private final ProjectGuardFactory.ProjectPurchaseToAdaptGuard projectPurchaseToAdaptGuard; @Override public StateMachine build() throws StateMachineException { @@ -149,13 +151,15 @@ public class ProjectStateMachineBuilderImpl implements BaseStateMachineBuilder

待初验 .withExternal() .source(ProjectStatus.ON_PURCHASING) .target(ProjectStatus.TO_BE_FIRST_INSPECTED) .event(ProjectStateChangeEvent.SUBMIT_PURCHASE_CONTRACT_RECORD) - .guard(new ProjectPurchaseToFirstAcceptGuard()) + .guard(projectPurchaseToAcceptGuard) .and() // 填写试试计划 -> 待初验 .withExternal() diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/builder/impl/TenderStateMachineBuilderImpl.java b/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/builder/impl/TenderStateMachineBuilderImpl.java index e16659a..c1593a1 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/builder/impl/TenderStateMachineBuilderImpl.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/builder/impl/TenderStateMachineBuilderImpl.java @@ -3,7 +3,7 @@ package com.hz.pm.api.common.statemachine.builder.impl; import cn.hutool.core.collection.ListUtil; import com.hz.pm.api.common.statemachine.builder.BaseStateMachineBuilder; import com.hz.pm.api.common.statemachine.event.TenderStateChangeEvent; -import com.hz.pm.api.common.statemachine.factory.TenderGuardFactory; +import com.hz.pm.api.common.statemachine.factory.TenderGuardFactory.PurchaseContractRecordToAcceptGuard; import com.hz.pm.api.projectdeclared.model.entity.Purchase; import com.hz.pm.api.projectlib.model.enumeration.status.ITenderStatus; import com.hz.pm.api.projectlib.model.enumeration.status.TenderAdaptStatus; @@ -26,6 +26,8 @@ import org.springframework.stereotype.Component; import java.util.HashSet; import java.util.List; +import static com.hz.pm.api.common.statemachine.factory.TenderGuardFactory.PurchaseContractRecordToOperationGuard; + /** *

* 标段状态机 @@ -36,13 +38,16 @@ import java.util.List; */ @Slf4j @Component -@EnableStateMachine(name = TenderStateMachineBuilderImpl.MACHINE_ID) @RequiredArgsConstructor +@EnableStateMachine(name = TenderStateMachineBuilderImpl.MACHINE_ID) public class TenderStateMachineBuilderImpl implements BaseStateMachineBuilder { public static final String MACHINE_ID = "tenderStateMachine"; private final BeanFactory beanFactory; + private final PurchaseContractRecordToAcceptGuard purchaseContractRecordToAcceptGuard; + private final PurchaseContractRecordToOperationGuard purchaseContractRecordToOperationGuard; + @Override public StateMachine build() throws StateMachineException { @@ -81,12 +86,13 @@ public class TenderStateMachineBuilderImpl implements BaseStateMachineBuilder { + + private IPurchaseService purchaseService; + + @Override + public boolean evaluate(StateContext ctx) { + return !canTurnToAdapt(ctx, purchaseService); + } + } - public static class ProjectPurchaseToFirstAcceptGuard implements Guard { + @AllArgsConstructor + public static class ProjectPurchaseToAdaptGuard implements Guard { - private final IPurchaseService purchaseService = SpringUtils.getBean(IPurchaseService.class); + private IPurchaseService purchaseService; @Override - public boolean evaluate(StateContext stateContext) { - Project project = ProjectStateChangeAction.getProject(stateContext.getMessage()); - Wrapper query = Wrappers.lambdaQuery(Purchase.class) - .select(Purchase::getId, Purchase::getBidType) - .eq(Purchase::getProjectId, project.getId()); - List purchases = purchaseService.list(query); - return CollUtil.allMatch(purchases, w -> !BidTypeEnum.BUILD_APP.eq(w.getBidType())); + public boolean evaluate(StateContext ctx) { + return canTurnToAdapt(ctx, purchaseService); } } + private static boolean canTurnToAdapt(StateContext ctx, + IPurchaseService purchaseService) { + Project project = ProjectStateChangeAction.getProject(ctx.getMessage()); + Wrapper query = Wrappers.lambdaQuery(Purchase.class) + .select(Purchase::getId, Purchase::getBidType) + .eq(Purchase::getProjectId, project.getId()); + List purchases = purchaseService.list(query); + return CollUtil.anyMatch(purchases, w -> BidTypeEnum.BUILD_APP.eq(w.getBidType())); + } + + + @Bean + public ProjectPurchaseToAcceptGuard projectPurchaseToAcceptGuard() { + return new ProjectPurchaseToAcceptGuard(purchaseService); + } + + @Bean + public ProjectPurchaseToAdaptGuard projectPurchaseToAdaptGuard() { + return new ProjectPurchaseToAdaptGuard(purchaseService); + } + } diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/factory/TenderGuardFactory.java b/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/factory/TenderGuardFactory.java index 95e7a7c..83297d3 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/factory/TenderGuardFactory.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/factory/TenderGuardFactory.java @@ -5,6 +5,8 @@ import com.hz.pm.api.common.statemachine.event.TenderStateChangeEvent; import com.hz.pm.api.projectdeclared.model.entity.Purchase; import com.hz.pm.api.projectdeclared.model.enumerization.BidTypeEnum; import com.hz.pm.api.projectlib.model.enumeration.status.ITenderStatus; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; import org.springframework.statemachine.StateContext; import org.springframework.statemachine.guard.Guard; @@ -16,12 +18,28 @@ import org.springframework.statemachine.guard.Guard; * @author WendyYang * @since 17:51 2024/8/20 */ +@Configuration public class TenderGuardFactory { - private TenderGuardFactory() { + @Bean + public PurchaseContractRecordToOperationGuard purchaseContractRecordToOperationGuard() { + return new PurchaseContractRecordToOperationGuard(); } - public static class PurchaseContractRecordGuard implements Guard { + @Bean + public PurchaseContractRecordToAcceptGuard purchaseContractRecordToAcceptGuard() { + return new PurchaseContractRecordToAcceptGuard(); + } + + public static class PurchaseContractRecordToOperationGuard implements Guard { + @Override + public boolean evaluate(StateContext context) { + Purchase purchase = TenderStateChangeActionUtil.getPurchaseInfo(context.getMessage()); + return BidTypeEnum.BUILD_APP.eq(purchase.getBidType()); + } + } + + public static class PurchaseContractRecordToAcceptGuard implements Guard { @Override public boolean evaluate(StateContext context) { Purchase purchase = TenderStateChangeActionUtil.getPurchaseInfo(context.getMessage()); diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/AbstractStateMachineUtil.java b/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/AbstractStateMachineUtil.java index f64afc1..1a8ddad 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/AbstractStateMachineUtil.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/AbstractStateMachineUtil.java @@ -1,9 +1,10 @@ package com.hz.pm.api.common.statemachine.util; +import cn.hutool.log.Log; +import cn.hutool.log.LogFactory; import com.hz.pm.api.common.statemachine.event.AbstractStateChangeEvent; import com.ningdatech.basic.exception.BizException; import com.wflow.exception.BusinessException; -import org.slf4j.LoggerFactory; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; @@ -19,6 +20,8 @@ import java.util.function.Function; */ public interface AbstractStateMachineUtil & AbstractStateChangeEvent> { + Log LOG = LogFactory.get(AbstractStateMachineUtil.class); + /** * 获取状态变更事件类型 * @@ -29,12 +32,19 @@ public interface AbstractStateMachineUtil & AbstractStateCh return (Class) ((ParameterizedType) type).getActualTypeArguments()[1]; } + default AbstractStateMachineUtil getLockClass() { + LOG.info("acquire state machine lock:{}", this.getClass().getSimpleName()); + return this; + } + //通过审核 default void pass(O obj) { try { - execute(obj, AbstractStateChangeEvent.getPassEvent(eventClass(), statusFunction().apply(obj))); + synchronized (getLockClass()) { + execute(obj, AbstractStateChangeEvent.getPassEvent(eventClass(), statusFunction().apply(obj))); + } } catch (Exception e) { - LoggerFactory.getLogger(this.getClass()).info("状态机 通过失败", e); + LOG.error("状态机通过失败", e); throw BizException.wrap("状态机通过失败"); } } @@ -43,9 +53,11 @@ public interface AbstractStateMachineUtil & AbstractStateCh //拒绝 default void reject(O obj) { try { - execute(obj, AbstractStateChangeEvent.getRejectEvent(eventClass(), statusFunction().apply(obj))); + synchronized (getLockClass()) { + execute(obj, AbstractStateChangeEvent.getRejectEvent(eventClass(), statusFunction().apply(obj))); + } } catch (Exception e) { - LoggerFactory.getLogger(this.getClass()).info("状态机 拒绝失败 :{}", e.getMessage()); + LOG.error("状态机拒绝失败", e); throw new BusinessException("状态机拒绝失败"); } } @@ -53,9 +65,11 @@ public interface AbstractStateMachineUtil & AbstractStateCh //撤回 default void withDraw(O obj) { try { - execute(obj, AbstractStateChangeEvent.getWithdrawEvent(eventClass(), statusFunction().apply(obj))); + synchronized (getLockClass()) { + execute(obj, AbstractStateChangeEvent.getWithdrawEvent(eventClass(), statusFunction().apply(obj))); + } } catch (Exception e) { - LoggerFactory.getLogger(this.getClass()).info("状态机 撤回失败 :{}", e.getMessage()); + LOG.error("状态机撤回失败", e); throw new BusinessException("状态机撤回失败"); } } diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/AdaptStateMachineUtil.java b/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/AdaptStateMachineUtil.java index a74f381..83c881c 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/AdaptStateMachineUtil.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/AdaptStateMachineUtil.java @@ -5,10 +5,8 @@ import com.hz.pm.api.common.statemachine.event.AdaptStateChangeEvent; import com.hz.pm.api.projectdeclared.model.entity.Purchase; import com.hz.pm.api.projectdeclared.utils.ProjectIdCodeCacheUtil; import com.hz.pm.api.projectlib.entity.PurchaseStatusChange; -import com.hz.pm.api.projectlib.model.enumeration.status.ITenderStatus; import com.hz.pm.api.projectlib.model.enumeration.status.TenderAdaptStatus; import com.hz.pm.api.projectlib.service.IPurchaseStatusChangeService; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.messaging.Message; import org.springframework.messaging.support.MessageBuilder; @@ -29,16 +27,23 @@ import java.util.function.Function; */ @Slf4j @Component -@RequiredArgsConstructor public class AdaptStateMachineUtil implements AbstractStateMachineUtil { public static final String PURCHASE = "purchaseInfo"; //================================================================================================================== - private final AdaptStateMachineBuilderImpl adaptStateMachineBuilder; + private final StateMachinePersister stateMachinePersister; + private final StateMachine stateMachine; private final IPurchaseStatusChangeService purchaseStatusChangeService; + public AdaptStateMachineUtil(AdaptStateMachineBuilderImpl adaptStateMachineBuilder, + IPurchaseStatusChangeService purchaseStatusChangeService) { + this.purchaseStatusChangeService = purchaseStatusChangeService; + this.stateMachine = adaptStateMachineBuilder.build(); + this.stateMachinePersister = adaptStateMachineBuilder.stateMachinePersister(); + } + @Override public Function statusFunction() { return Purchase::getAdaptStatus; @@ -46,8 +51,6 @@ public class AdaptStateMachineUtil implements AbstractStateMachineUtil stateMachine = adaptStateMachineBuilder.build(); Message message = MessageBuilder.withPayload(event) .setHeader(PURCHASE, purchase) .build(); //初始化状态机 - StateMachinePersister stateMachinePersister = adaptStateMachineBuilder.stateMachinePersister(); stateMachinePersister.restore(stateMachine, purchase); stateMachine.sendEvent(message); change.setAfterStatus(purchase.getAdaptStatus()); purchaseStatusChangeService.save(change); - log.info("调用状态机后的标段状态为:{}", purchase.getAdaptStatus()); + log.info("调用状态机后的标段状态为:{} ==> {}", change.getBeforeStatus(), change.getAfterStatus()); } } diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/ProjectStateMachineUtil.java b/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/ProjectStateMachineUtil.java index b7050d4..1f0d44b 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/ProjectStateMachineUtil.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/ProjectStateMachineUtil.java @@ -27,7 +27,6 @@ import java.util.function.Function; */ @Slf4j @Component -@RequiredArgsConstructor public class ProjectStateMachineUtil implements AbstractStateMachineUtil { private static final String PROJECT_DECLARE = StateMachineConst.PROJECT_DECLARE; @@ -36,12 +35,20 @@ public class ProjectStateMachineUtil implements AbstractStateMachineUtil stateMachinePersister; + private final StateMachine stateMachine; private final IProjectStatusChangeService projectStatusChangeService; - private final IProjectApplicationService projectApplicationService; + public ProjectStateMachineUtil(ProjectStateMachineBuilderImpl projectStateMachineBuilder, + IProjectStatusChangeService projectStatusChangeService, + IProjectApplicationService projectApplicationService) { + this.projectStatusChangeService = projectStatusChangeService; + this.projectApplicationService = projectApplicationService; + this.stateMachinePersister = projectStateMachineBuilder.stateMachinePersister(); + this.stateMachine = projectStateMachineBuilder.build(); + } + @Override public Function statusFunction() { return Project::getStatus; @@ -49,29 +56,25 @@ public class ProjectStateMachineUtil implements AbstractStateMachineUtil stateMachine = projectStateMachineBuilder.build(); Message message = MessageBuilder.withPayload(event) .setHeader(PROJECT_DECLARE, project) .setHeader(APPLICATION_DECLARE, projectApplicationService.getApplicationsByProject(project)) .build(); //初始化状态机 - StateMachinePersister projectDeclareStateMachinePersister = projectStateMachineBuilder.stateMachinePersister(); - projectDeclareStateMachinePersister.restore(stateMachine, project); + stateMachinePersister.restore(stateMachine, project); stateMachine.sendEvent(message); - projectStatusChange.setProjectId(project.getId()); - projectStatusChange.setAfterStatus(project.getStatus()); - projectStatusChange.setEvent(event.name()); - projectStatusChange.setCreateOn(LocalDateTime.now()); - projectStatusChange.setProjectCode(project.getProjectCode()); + change.setProjectId(project.getId()); + change.setAfterStatus(project.getStatus()); + change.setEvent(event.name()); + change.setCreateOn(LocalDateTime.now()); + change.setProjectCode(project.getProjectCode()); // 插入项目状态变更表中 - projectStatusChangeService.save(projectStatusChange); - log.info("调用状态机后的项目状态为:{}", project.getStatus()); + projectStatusChangeService.save(change); + log.info("调用状态机后的标段状态为:{} ==> {}", change.getBeforeStatus(), change.getAfterStatus()); } } diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/SelfTestStateMachineUtil.java b/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/SelfTestStateMachineUtil.java index 25f096d..513a8ba 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/SelfTestStateMachineUtil.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/SelfTestStateMachineUtil.java @@ -28,15 +28,21 @@ import java.util.function.Function; */ @Slf4j @Component -@RequiredArgsConstructor public class SelfTestStateMachineUtil implements AbstractStateMachineUtil { public static final String PURCHASE = "purchaseInfo"; //================================================================================================================== - private final SelfTestStateMachineBuilderImpl selfTestStateMachineBuilder; private final IPurchaseStatusChangeService purchaseStatusChangeService; + private final StateMachinePersister stateMachinePersister; + private final StateMachine stateMachine; + + public SelfTestStateMachineUtil(SelfTestStateMachineBuilderImpl selfTestStateMachineBuilder, IPurchaseStatusChangeService purchaseStatusChangeService) { + this.purchaseStatusChangeService = purchaseStatusChangeService; + this.stateMachinePersister = selfTestStateMachineBuilder.stateMachinePersister(); + this.stateMachine = selfTestStateMachineBuilder.build(); + } @Override public Function statusFunction() { @@ -45,7 +51,6 @@ public class SelfTestStateMachineUtil implements AbstractStateMachineUtil stateMachine = selfTestStateMachineBuilder.build(); Message message = MessageBuilder.withPayload(event) .setHeader(PURCHASE, purchase) .build(); //初始化状态机 - StateMachinePersister stateMachinePersister = selfTestStateMachineBuilder.stateMachinePersister(); stateMachinePersister.restore(stateMachine, purchase); stateMachine.sendEvent(message); change.setAfterStatus(purchase.getSelfTestStatus()); purchaseStatusChangeService.save(change); - log.info("调用状态机后的标段状态为:{}", purchase.getSelfTestStatus()); + log.info("调用状态机后的标段状态为:{} ==> {}", change.getBeforeStatus(), change.getAfterStatus()); } } diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/TenderStateMachineUtil.java b/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/TenderStateMachineUtil.java index b429652..983e34d 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/TenderStateMachineUtil.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/TenderStateMachineUtil.java @@ -7,6 +7,7 @@ import com.hz.pm.api.projectdeclared.utils.ProjectIdCodeCacheUtil; import com.hz.pm.api.projectlib.entity.PurchaseStatusChange; import com.hz.pm.api.projectlib.model.enumeration.status.ITenderStatus; import com.hz.pm.api.projectlib.service.IPurchaseStatusChangeService; +import com.ningdatech.basic.exception.BizException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.messaging.Message; @@ -28,15 +29,21 @@ import java.util.function.Function; */ @Slf4j @Component -@RequiredArgsConstructor public class TenderStateMachineUtil implements AbstractStateMachineUtil { public static final String PURCHASE = "purchaseInfo"; //================================================================================================================== - private final TenderStateMachineBuilderImpl tenderStateMachineBuilder; private final IPurchaseStatusChangeService purchaseStatusChangeService; + private final StateMachinePersister stateMachinePersister; + private final StateMachine stateMachine; + + public TenderStateMachineUtil(IPurchaseStatusChangeService purchaseStatusChangeService, TenderStateMachineBuilderImpl tenderStateMachineBuilder) { + this.purchaseStatusChangeService = purchaseStatusChangeService; + this.stateMachinePersister = tenderStateMachineBuilder.stateMachinePersister(); + this.stateMachine = tenderStateMachineBuilder.build(); + } @Override public Function statusFunction() { @@ -45,7 +52,6 @@ public class TenderStateMachineUtil implements AbstractStateMachineUtil stateMachine = tenderStateMachineBuilder.build(); Message message = MessageBuilder.withPayload(event) .setHeader(PURCHASE, purchase) .build(); //初始化状态机 - StateMachinePersister stateMachinePersister = tenderStateMachineBuilder.stateMachinePersister(); stateMachinePersister.restore(stateMachine, purchase); stateMachine.sendEvent(message); change.setAfterStatus(purchase.getStatus()); purchaseStatusChangeService.save(change); - log.info("调用状态机后的标段状态为:{}", purchase.getStatus()); + log.info("调用状态机后的标段状态为:{} ==> {}", change.getBeforeStatus(), change.getAfterStatus()); } } diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/TestValidStateMachineUtil.java b/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/TestValidStateMachineUtil.java index 58ff54c..5e069d8 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/TestValidStateMachineUtil.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/TestValidStateMachineUtil.java @@ -45,8 +45,6 @@ public class TestValidStateMachineUtil implements AbstractStateMachineUtil {}", change.getBeforeStatus(), change.getAfterStatus()); } } diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/XcfhxStateMachineUtil.java b/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/XcfhxStateMachineUtil.java index f41cf4b..f4f1127 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/XcfhxStateMachineUtil.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/XcfhxStateMachineUtil.java @@ -28,15 +28,22 @@ import java.util.function.Function; */ @Slf4j @Component -@RequiredArgsConstructor public class XcfhxStateMachineUtil implements AbstractStateMachineUtil { public static final String PURCHASE = "purchaseInfo"; //================================================================================================================== - private final XcfhxStateMachineBuilderImpl xcfhxStateMachineBuilder; private final IPurchaseStatusChangeService purchaseStatusChangeService; + private final StateMachinePersister stateMachinePersister; + private final StateMachine stateMachine; + + public XcfhxStateMachineUtil(XcfhxStateMachineBuilderImpl xcfhxStateMachineBuilder, + IPurchaseStatusChangeService purchaseStatusChangeService) { + this.purchaseStatusChangeService = purchaseStatusChangeService; + this.stateMachine = xcfhxStateMachineBuilder.build(); + this.stateMachinePersister = xcfhxStateMachineBuilder.stateMachinePersister(); + } @Override public Function statusFunction() { @@ -45,8 +52,6 @@ public class XcfhxStateMachineUtil implements AbstractStateMachineUtil stateMachine = xcfhxStateMachineBuilder.build(); Message message = MessageBuilder.withPayload(event) .setHeader(PURCHASE, purchase) .build(); //初始化状态机 - StateMachinePersister stateMachinePersister = xcfhxStateMachineBuilder.stateMachinePersister(); stateMachinePersister.restore(stateMachine, purchase); stateMachine.sendEvent(message); change.setAfterStatus(purchase.getXcfhxApplyStatus()); purchaseStatusChangeService.save(change); - log.info("调用状态机后的标段状态为:{}", purchase.getXcfhxApplyStatus()); + log.info("调用状态机后的标段状态为:{} ==> {}", change.getBeforeStatus(), change.getAfterStatus()); } } diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/common/util/ThreadPoolUtil.java b/hz-pm-api/src/main/java/com/hz/pm/api/common/util/ThreadPoolUtil.java index cd8584a..a883990 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/common/util/ThreadPoolUtil.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/common/util/ThreadPoolUtil.java @@ -28,7 +28,6 @@ public class ThreadPoolUtil { static { ThreadPoolUtilProperties properties = SpringUtil.getBean(ThreadPoolUtilProperties.class); - log.info("ThreadPoolUtilProperties:{}", properties); ThreadPoolProperties requestProps = properties.getRequest(); REQUEST = new MDCThreadPoolTaskExecutor(); REQUEST.setCorePoolSize(requestProps.getCorePoolSize()); @@ -47,7 +46,6 @@ public class ThreadPoolUtil { SCHEDULER.setPoolSize(schedulerProps.getCorePoolSize()); SCHEDULER.setThreadPriority(Thread.NORM_PRIORITY - 1); SCHEDULER.setWaitForTasksToCompleteOnShutdown(schedulerProps.getWaitForTasksToCompleteOnShutdown()); - SCHEDULER.setThreadNamePrefix("scheduler-"); SCHEDULER.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); SCHEDULER.initialize(); } diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/meeting/task/ExpertInviteExecutorConfig.java b/hz-pm-api/src/main/java/com/hz/pm/api/meeting/task/ExpertInviteExecutorConfig.java index f73bf5d..898f866 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/meeting/task/ExpertInviteExecutorConfig.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/meeting/task/ExpertInviteExecutorConfig.java @@ -1,5 +1,7 @@ package com.hz.pm.api.meeting.task; +import com.hz.pm.api.common.config.ThreadPoolUtilProperties.ThreadPoolProperties; +import com.hz.pm.api.common.util.MDCThreadPoolTaskScheduler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; @@ -16,13 +18,14 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; public class ExpertInviteExecutorConfig { @Bean(name = "expertInviteScheduler") - public ThreadPoolTaskScheduler threadPoolTaskScheduler() { - ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); - scheduler.setPoolSize(3); + public ThreadPoolTaskScheduler threadPoolTaskScheduler(RandomInviteProperties properties) { + ThreadPoolProperties threadPoolProperties = properties.getThreadPoolProperties(); + MDCThreadPoolTaskScheduler scheduler = new MDCThreadPoolTaskScheduler(); + scheduler.setPoolSize(threadPoolProperties.getCorePoolSize()); scheduler.setThreadGroupName("expert-invite"); - scheduler.setThreadNamePrefix("invite-executor-"); - scheduler.setAwaitTerminationSeconds(60); - scheduler.setWaitForTasksToCompleteOnShutdown(true); + scheduler.setThreadNamePrefix(threadPoolProperties.getThreadNamePrefix()); + scheduler.setAwaitTerminationSeconds(120); + scheduler.setWaitForTasksToCompleteOnShutdown(threadPoolProperties.getWaitForTasksToCompleteOnShutdown()); return scheduler; } diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/meeting/task/MsgCallReplyRewriteTask.java b/hz-pm-api/src/main/java/com/hz/pm/api/meeting/task/MsgCallReplyRewriteTask.java index b0b6970..0e82572 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/meeting/task/MsgCallReplyRewriteTask.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/meeting/task/MsgCallReplyRewriteTask.java @@ -48,13 +48,15 @@ public class MsgCallReplyRewriteTask { static { // 初始化线程池 EXECUTOR = new MDCThreadPoolTaskExecutor(); + EXECUTOR.setBeanName("msgCallReplyRewriteExecutor"); EXECUTOR.setCorePoolSize(2); EXECUTOR.setMaxPoolSize(4); EXECUTOR.setQueueCapacity(100); EXECUTOR.setKeepAliveSeconds(120); - EXECUTOR.setThreadPriority(Thread.NORM_PRIORITY); + EXECUTOR.setThreadPriority(Thread.NORM_PRIORITY - 1); EXECUTOR.setWaitForTasksToCompleteOnShutdown(true); EXECUTOR.setThreadNamePrefix("callRewriteExecutor-"); + EXECUTOR.setAllowCoreThreadTimeOut(true); EXECUTOR.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); } diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/meeting/task/RandomInviteProperties.java b/hz-pm-api/src/main/java/com/hz/pm/api/meeting/task/RandomInviteProperties.java index 2b674b3..7f4a3f3 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/meeting/task/RandomInviteProperties.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/meeting/task/RandomInviteProperties.java @@ -1,7 +1,10 @@ package com.hz.pm.api.meeting.task; +import com.hz.pm.api.common.config.ThreadPoolUtilProperties; +import com.hz.pm.api.common.config.ThreadPoolUtilProperties.ThreadPoolProperties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.NestedConfigurationProperty; import org.springframework.stereotype.Component; /** @@ -56,4 +59,7 @@ public class RandomInviteProperties { private Integer inviteEndHour = 20; + @NestedConfigurationProperty + private ThreadPoolProperties threadPoolProperties; + } diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/controller/PurchaseController.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/controller/PurchaseController.java index 0b736ab..0c369d0 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/controller/PurchaseController.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/controller/PurchaseController.java @@ -88,8 +88,8 @@ public class PurchaseController { @GetMapping("/adaptionProgressStatistics") @ApiOperation("获取采购进度统计") - public AdaptionProgressStatVO adaptionProgressStatistics() { - return purchaseManage.adaptionProgressStatistics(); + public AdaptionProgressStatVO adaptionProgressStatistics(PurchaseAdaptionListReq req) { + return purchaseManage.adaptionProgressStatistics(req); } @GetMapping("/pageAdaption") diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/manage/PurchaseManage.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/manage/PurchaseManage.java index 6c88642..16d7471 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/manage/PurchaseManage.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/manage/PurchaseManage.java @@ -152,7 +152,7 @@ public class PurchaseManage { w -> CollUtil.anyMatch(w, x -> TenderMainStatus.TO_BE_SUBMIT_PURCHASE_CONSTRUCTION_INFO.eq(x.getStatus())))); stat.setToBePurchaseCount(CollUtil.count(projectPurchaseMap.values(), Collection::isEmpty)); stat.setPurchaseFinishedCount(CollUtil.count(projectPurchaseMap.values(), - w -> CollUtil.anyMatch(w, x -> !TenderMainStatus.TO_BE_SUBMIT_PURCHASE_CONSTRUCTION_INFO.eq(x.getStatus())))); + w -> !w.isEmpty() && CollUtil.allMatch(w, x -> !TenderMainStatus.TO_BE_SUBMIT_PURCHASE_CONSTRUCTION_INFO.eq(x.getStatus())))); stat.setTotalCount(projects.size()); return stat; } @@ -180,8 +180,8 @@ public class PurchaseManage { query.exists(ExistsSqlConst.PROJECT_EXISTS_PURCHASE + " and np.status = {0} ", req.getTabStatus()); } else if (TenderMainStatus.PURCHASE_FINISHED.eq(req.getTabStatus())) { - query.exists(ExistsSqlConst.PROJECT_EXISTS_PURCHASE_STATUS_CHANGE + - " and npsc.event = {0} ", TenderStateChangeEvent.SUBMIT_PURCHASE_CONSTRUCTION_INFO); + query.exists(ExistsSqlConst.PROJECT_EXISTS_STATUS_CHANGE + + " and npsc.event = {0} ", ProjectStateChangeEvent.SUBMIT_PURCHASE_CONTRACT_RECORD); } else if (ProjectStatus.TO_BE_PURCHASED.eq(req.getTabStatus())) { query.eq(Project::getStatus, ProjectStatus.TO_BE_PURCHASED.getCode()); } else { @@ -540,7 +540,7 @@ public class PurchaseManage { projectService.updateById(project); } - public AdaptionProgressStatVO adaptionProgressStatistics() { + public AdaptionProgressStatVO adaptionProgressStatistics(PurchaseAdaptionListReq req) { LambdaQueryWrapper query = Wrappers.lambdaQuery(Purchase.class) .select(Purchase::getStatus, Purchase::getId) .eq(Purchase::getBidType, BidTypeEnum.BUILD_APP.getCode()) @@ -554,6 +554,16 @@ public class PurchaseManage { if (!purchaseService.buildPurchaseQueryPermission(query, user)) { return null; } + if (req.hasProjectQuery()) { + List projectIds = filterProjectIdsForPurchase(req); + if (projectIds.isEmpty()) { + return null; + } + query.in(Purchase::getProjectId, projectIds); + } + query.like(StrUtil.isNotBlank(req.getBidName()), Purchase::getBidName, req.getBidName()) + .le(req.getCreateOnMax() != null, Purchase::getCreateOn, req.getCreateOnMax()) + .ge(req.getCreateOnMin() != null, Purchase::getCreateOn, req.getCreateOnMin()); List purchases = purchaseService.list(query); return adaptionProgressStatistics(purchases); } diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/req/SubmitPurchaseNoticeReq.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/req/SubmitPurchaseNoticeReq.java index 9f8af6a..f24dabb 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/req/SubmitPurchaseNoticeReq.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/req/SubmitPurchaseNoticeReq.java @@ -69,7 +69,7 @@ public class SubmitPurchaseNoticeReq { private String purchaseMethod; @ApiModelProperty("是否发布信创云图") - public Boolean publishMhNotice; + private Boolean publishMhNotice; @ApiModelProperty("采购范围:1 公开采购、2 非公开采购") private Integer purchaseScope; diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/ProjectMapper.xml b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/ProjectMapper.xml index 9547743..49644e5 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/ProjectMapper.xml +++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/mapper/ProjectMapper.xml @@ -359,6 +359,21 @@ and p.status = #{req.status} + + and p.stage = #{req.stage} + + + and p.status in + + #{statusItem} + + + + and p.stage in + + #{stageItem} + + and p.project_year = #{req.projectYear} diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/user/convert/UserInfoConvertor.java b/hz-pm-api/src/main/java/com/hz/pm/api/user/convert/UserInfoConvertor.java index c0b27bf..b88f79c 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/user/convert/UserInfoConvertor.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/user/convert/UserInfoConvertor.java @@ -29,6 +29,10 @@ public class UserInfoConvertor { userInfoDetails.setMhUnitName(userFullInfo.getMhUnitName()); userInfoDetails.setMobile(userFullInfo.getMobile()); userInfoDetails.setMhUserId(userFullInfo.getMhUserId()); + userInfoDetails.setIsCountyUser(userFullInfo.getIsCountyUser()); + userInfoDetails.setIsCitySoeUser(userFullInfo.getIsCitySoeUser()); + userInfoDetails.setIsCityDistrictUser(userFullInfo.getIsCityDistrictUser()); + userInfoDetails.setIsKeyIndustryUser(userFullInfo.getIsKeyIndustryUser()); return userInfoDetails; } diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/user/manage/UserInfoManage.java b/hz-pm-api/src/main/java/com/hz/pm/api/user/manage/UserInfoManage.java index fea19e2..979d7d7 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/user/manage/UserInfoManage.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/user/manage/UserInfoManage.java @@ -280,10 +280,7 @@ public class UserInfoManage { resUserDetail.setStatus(userInfo.getAvailable()); resUserDetail.setEmployeeCode(userInfo.getEmployeeCode()); resUserDetail.setMhUnitId(userInfo.getMhUnitId()); - UnitDTO unit = mhUnitCache.getById(userInfo.getMhUnitId()); - if (unit != null && unit.getType() != null) { - resUserDetail.setUnitStrip(unit.getType().getStrip().getCode()); - } + resUserDetail.setUnitStrip(userDetail.getUnitStrip()); resUserDetail.setMhUnitName(userInfo.getMhUnitName()); // 装配用户角色信息列表 @@ -300,7 +297,10 @@ public class UserInfoManage { }).collect(Collectors.toList()); resUserDetail.setUserRoleInfoList(userRoles); } - resUserDetail.setIsCountyUser(userDetail.isCountyUser()); + resUserDetail.setIsCountyUser(userDetail.getIsCountyUser()); + resUserDetail.setIsCityDistrictUser(userDetail.getIsCityDistrictUser()); + resUserDetail.setIsCityDistrictUser(userDetail.getIsCitySoeUser()); + resUserDetail.setIsKeyIndustryUser(userDetail.getIsKeyIndustryUser()); return resUserDetail; } diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/user/model/vo/ResUserDetailVO.java b/hz-pm-api/src/main/java/com/hz/pm/api/user/model/vo/ResUserDetailVO.java index 4f80066..f95c6fe 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/user/model/vo/ResUserDetailVO.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/user/model/vo/ResUserDetailVO.java @@ -54,4 +54,19 @@ public class ResUserDetailVO { @ApiModelProperty("是否是区县用户") private Boolean isCountyUser; + /** + * 是否是市属国有企业用户 + */ + private Boolean isCitySoeUser; + + /** + * 是否是市级单位用户 + */ + private Boolean isCityDistrictUser; + + /** + * 是否是重点行业用户 + */ + private Boolean isKeyIndustryUser; + } diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/user/security/model/UserFullInfoDTO.java b/hz-pm-api/src/main/java/com/hz/pm/api/user/security/model/UserFullInfoDTO.java index 80e70ad..0d617b7 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/user/security/model/UserFullInfoDTO.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/user/security/model/UserFullInfoDTO.java @@ -51,6 +51,27 @@ public class UserFullInfoDTO { */ private UserAvailableEnum available; + /** + * 是否是区县用户 + */ + private Boolean isCountyUser; + + /** + * 是否是市属国有企业 + */ + private Boolean isCitySoeUser; + + /** + * 是否是市级单位 + */ + private Boolean isCityDistrictUser; + + /** + * 是否是重点行业 + */ + private Boolean isKeyIndustryUser; + + private Integer unitStrip; /** * 取最高的权限 diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/user/security/model/UserInfoDetails.java b/hz-pm-api/src/main/java/com/hz/pm/api/user/security/model/UserInfoDetails.java index 49bbf6e..1e44040 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/user/security/model/UserInfoDetails.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/user/security/model/UserInfoDetails.java @@ -57,6 +57,28 @@ public class UserInfoDetails extends AbstractLoginUser implements UserDetails { private String mobile; + /** + * 是否是区县用户 + */ + private Boolean isCountyUser; + + /** + * 是否是市属国有企业 + */ + private Boolean isCitySoeUser; + + /** + * 是否是市级单位 + */ + private Boolean isCityDistrictUser; + + /** + * 是否是重点行业 + */ + private Boolean isKeyIndustryUser; + + private Integer unitStrip; + public String getUserIdStr() { return String.valueOf(getUserId()); } diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/workbench/manage/WorkbenchManage.java b/hz-pm-api/src/main/java/com/hz/pm/api/workbench/manage/WorkbenchManage.java index e806286..502ac73 100644 --- a/hz-pm-api/src/main/java/com/hz/pm/api/workbench/manage/WorkbenchManage.java +++ b/hz-pm-api/src/main/java/com/hz/pm/api/workbench/manage/WorkbenchManage.java @@ -424,7 +424,7 @@ public class WorkbenchManage { currStat.setTargetCount(systemReplaceCount.getValue()); List projectCodes = CollUtils.convert(projectIds, ProjectIdCodeCacheUtil::get); currStat.setStoppedCount(stoppedProjectCount(projectStatusChangeMap, projectCodes)); - if (!purchases.isEmpty()) { + if (!projectIds.isEmpty()) { Wrapper pQuery = Wrappers.lambdaQuery(PurchaseStatusChange.class) .select(PurchaseStatusChange::getEvent, PurchaseStatusChange::getProjectId) .in(PurchaseStatusChange::getProjectId, projectIds) diff --git a/hz-pm-api/src/main/resources/application-dev.yml b/hz-pm-api/src/main/resources/application-dev.yml index 58f5fc1..8b16536 100644 --- a/hz-pm-api/src/main/resources/application-dev.yml +++ b/hz-pm-api/src/main/resources/application-dev.yml @@ -225,5 +225,7 @@ thread-pool-util: scheduler: core-pool-size: 2 thread-name-prefix: scheduler-executor- -early-warning-without-submit: - open: true \ No newline at end of file +random-invite: + thread-pool-properties: + core-pool-size: 2 + thread-name-prefix: expert-invite-executor- \ No newline at end of file diff --git a/hz-pm-api/src/main/resources/application-prod.yml b/hz-pm-api/src/main/resources/application-prod.yml index cf9f0ef..9efb5b9 100644 --- a/hz-pm-api/src/main/resources/application-prod.yml +++ b/hz-pm-api/src/main/resources/application-prod.yml @@ -248,5 +248,7 @@ wflow-thread-pool-util: queue-capacity: 300 keep-alive-seconds: 120 max-pool-size: 8 -early-warning-without-submit: - open: true +random-invite: + thread-pool-properties: + core-pool-size: 3 + thread-name-prefix: expert-invite-executor- \ No newline at end of file diff --git a/hz-pm-api/src/test/java/com/hz/pm/api/common/StateMachineTest.java b/hz-pm-api/src/test/java/com/hz/pm/api/common/StateMachineTest.java new file mode 100644 index 0000000..8e32776 --- /dev/null +++ b/hz-pm-api/src/test/java/com/hz/pm/api/common/StateMachineTest.java @@ -0,0 +1,46 @@ +package com.hz.pm.api.common; + +import com.hz.pm.api.AppTests; +import com.hz.pm.api.common.statemachine.util.TenderStateMachineUtil; +import com.hz.pm.api.common.statemachine.util.XcfhxStateMachineUtil; +import com.hz.pm.api.common.util.ThreadPoolUtil; +import com.hz.pm.api.projectdeclared.model.entity.Purchase; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.concurrent.CountDownLatch; + +/** + *

+ * StateMachineTest + *

+ * + * @author WendyYang + * @since 19:43 2024/8/29 + */ +public class StateMachineTest extends AppTests { + + @Autowired + private TenderStateMachineUtil tenderStateMachineUtil; + @Autowired + private XcfhxStateMachineUtil xcfhxStateMachineUtil; + + @Test + public void test() { + CountDownLatch count = new CountDownLatch(1000); + for (int j = 0; j < 100; j++) { + ThreadPoolUtil.REQUEST.execute(() -> { + Purchase purchase = new Purchase(); + purchase.setProjectId(3496L); + for (int i = 0; i < 5; i++) { + purchase.setBidType(i % 2 == 0 ? 2 : 1); + purchase.setStatus(101); + purchase.setXcfhxApplyStatus(301); + xcfhxStateMachineUtil.pass(purchase); + } + count.countDown(); + }); + } + } + +} diff --git a/hz-pm-api/src/test/resources/application-dev.yml b/hz-pm-api/src/test/resources/application-dev.yml index 58f5fc1..b9d5c9e 100644 --- a/hz-pm-api/src/test/resources/application-dev.yml +++ b/hz-pm-api/src/test/resources/application-dev.yml @@ -217,13 +217,11 @@ mh-system-replace-sync: thread-pool-util: request: - core-pool-size: 2 - max-pool-size: 4 + core-pool-size: 5 + max-pool-size: 10 queue-capacity: 100 keep-alive-seconds: 120 thread-name-prefix: request-executor- scheduler: core-pool-size: 2 - thread-name-prefix: scheduler-executor- -early-warning-without-submit: - open: true \ No newline at end of file + thread-name-prefix: scheduler-executor- \ No newline at end of file diff --git a/pom.xml b/pom.xml index 2d0c6b0..2545291 100644 --- a/pom.xml +++ b/pom.xml @@ -103,7 +103,7 @@ org.springframework.statemachine spring-statemachine-core - 2.0.1.RELEASE + 2.2.0.RELEASE com.github.oshi