diff --git a/fw-valhalla-common/src/main/java/cn/fw/valhalla/common/utils/ThreadPoolUtil.java b/fw-valhalla-common/src/main/java/cn/fw/valhalla/common/utils/ThreadPoolUtil.java new file mode 100644 index 0000000..acdf997 --- /dev/null +++ b/fw-valhalla-common/src/main/java/cn/fw/valhalla/common/utils/ThreadPoolUtil.java @@ -0,0 +1,43 @@ +package cn.fw.valhalla.common.utils; + +import cn.hutool.core.thread.ExecutorBuilder; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; + +/** + * ThreadPoolUtl + * + * @author : kurisu + * @version : 2.0 + * @className : ThreadPoolUtl + * @description : ThreadPoolUtl + * @date : 2023-04-19 17:31 + */ +public class ThreadPoolUtil { + private static volatile ThreadPoolUtil INSTANCE; + private final ExecutorService executor; + + private ThreadPoolUtil() { + this.executor = ExecutorBuilder.create() + .setCorePoolSize(20) + .setMaxPoolSize(60) + .setWorkQueue(new LinkedBlockingQueue<>(4096)) + .build(); + } + + public static ThreadPoolUtil getInstance() { + if (INSTANCE == null) { + synchronized (ThreadPoolUtil.class) { + if (INSTANCE == null) { + INSTANCE = new ThreadPoolUtil(); + } + } + } + return INSTANCE; + } + + public ExecutorService getExecutor() { + return executor; + } +} diff --git a/fw-valhalla-domain/src/main/java/cn/fw/valhalla/domain/enums/PubStandType.java b/fw-valhalla-domain/src/main/java/cn/fw/valhalla/domain/enums/PubStandType.java index fc646a9..2339ace 100644 --- a/fw-valhalla-domain/src/main/java/cn/fw/valhalla/domain/enums/PubStandType.java +++ b/fw-valhalla-domain/src/main/java/cn/fw/valhalla/domain/enums/PubStandType.java @@ -22,6 +22,14 @@ public enum PubStandType implements IEnum { * 市场活动 */ ACTIVITY(2), + /** + * 续保 + */ + IR(3), + /** + * 事故车 + */ + AC(4), ; /** diff --git a/fw-valhalla-server/src/main/java/cn/fw/valhalla/controller/task/FollowTaskDealTask.java b/fw-valhalla-server/src/main/java/cn/fw/valhalla/controller/task/FollowTaskDealTask.java index 3e518b3..5643858 100644 --- a/fw-valhalla-server/src/main/java/cn/fw/valhalla/controller/task/FollowTaskDealTask.java +++ b/fw-valhalla-server/src/main/java/cn/fw/valhalla/controller/task/FollowTaskDealTask.java @@ -1,6 +1,7 @@ package cn.fw.valhalla.controller.task; import cn.fw.valhalla.common.utils.DateUtil; +import cn.fw.valhalla.common.utils.ThreadPoolUtil; import cn.fw.valhalla.domain.db.follow.ClueTask; import cn.fw.valhalla.domain.db.follow.FollowClue; import cn.fw.valhalla.domain.enums.ClueStatusEnum; @@ -18,6 +19,7 @@ import org.springframework.util.CollectionUtils; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; +import java.util.concurrent.CompletableFuture; /** * @author : kurisu @@ -50,14 +52,15 @@ public class FollowTaskDealTask { .eq(FollowClue::getClueState, ClueStatusEnum.WAITING) .gt(FollowClue::getStartTime, DateUtil.localDateTime2Date(LocalDate.now().minusDays(1L).atTime(23, 59, 59))) .le(FollowClue::getStartTime, DateUtil.localDateTime2Date(LocalDateTime.now())) - .last("limit 0, 500") + .last("limit 0, 300") ); if (CollectionUtils.isEmpty(list)) { return; } - for (FollowClue cluePool : list) { - followBizService.startClue(cluePool); - } + CompletableFuture[] futures = list.stream() + .map(clue -> CompletableFuture.runAsync(() -> followBizService.startClue(clue), ThreadPoolUtil.getInstance().getExecutor())) + .>toArray(CompletableFuture[]::new); + CompletableFuture.allOf(futures).join(); } /** @@ -68,18 +71,18 @@ public class FollowTaskDealTask { List list = clueTaskService.list(Wrappers.lambdaQuery() .eq(ClueTask::getState, TaskStateEnum.ONGOING) .le(ClueTask::getDeadline, LocalDateTime.now()) - .last("limit 0, 500") + .last("limit 0, 300") ); if (CollectionUtils.isEmpty(list)) { return; } - for (ClueTask r : list) { - followBizService.endTask(r); - } + CompletableFuture[] futures = list.stream() + .map(task -> CompletableFuture.runAsync(() -> followBizService.endTask(task), ThreadPoolUtil.getInstance().getExecutor())) + .>toArray(CompletableFuture[]::new); + CompletableFuture.allOf(futures).join(); } - /** * 任务结束同步状态到跟进系统 */ @@ -93,8 +96,9 @@ public class FollowTaskDealTask { if (CollectionUtils.isEmpty(list)) { return; } - for (ClueTask r : list) { - followBizService.syncEndTask(r); - } + CompletableFuture[] futures = list.stream() + .map(task -> CompletableFuture.runAsync(() -> followBizService.syncEndTask(task), ThreadPoolUtil.getInstance().getExecutor())) + .>toArray(CompletableFuture[]::new); + CompletableFuture.allOf(futures).join(); } } diff --git a/fw-valhalla-server/src/main/java/cn/fw/valhalla/controller/task/PubFollowTask.java b/fw-valhalla-server/src/main/java/cn/fw/valhalla/controller/task/PubFollowTask.java index 4ecc07d..af033fc 100644 --- a/fw-valhalla-server/src/main/java/cn/fw/valhalla/controller/task/PubFollowTask.java +++ b/fw-valhalla-server/src/main/java/cn/fw/valhalla/controller/task/PubFollowTask.java @@ -45,6 +45,7 @@ public class PubFollowTask { @Getter(AccessLevel.PRIVATE) private String pubClueCompleteKey; + public PubFollowTask(final StringRedisTemplate stringRedisTemplate, final PubFollowBizService pubFollowBizService, final PubCluePoolService pubCluePoolService) { @@ -98,6 +99,7 @@ public class PubFollowTask { } } + /** * 处理角色变动战败公共池跟进线索 */ diff --git a/fw-valhalla-server/src/main/java/cn/fw/valhalla/controller/task/PubStandTask.java b/fw-valhalla-server/src/main/java/cn/fw/valhalla/controller/task/PubStandTask.java index f7e06a2..3cd8c72 100644 --- a/fw-valhalla-server/src/main/java/cn/fw/valhalla/controller/task/PubStandTask.java +++ b/fw-valhalla-server/src/main/java/cn/fw/valhalla/controller/task/PubStandTask.java @@ -2,10 +2,12 @@ package cn.fw.valhalla.controller.task; import cn.fw.common.cache.locker.DistributedLocker; import cn.fw.valhalla.common.utils.StringUtils; +import cn.fw.valhalla.domain.db.pub.PubCluePool; import cn.fw.valhalla.rpc.oop.OopService; import cn.fw.valhalla.rpc.oop.dto.GroupDTO; import cn.fw.valhalla.service.bus.pub.PubDistributeBizService; import cn.fw.valhalla.service.bus.pub.PubStandBizService; +import com.alibaba.fastjson.JSONObject; import lombok.AccessLevel; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -24,6 +26,7 @@ import org.springframework.util.CollectionUtils; import java.time.MonthDay; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @@ -46,10 +49,16 @@ public class PubStandTask { private final StringRedisTemplate redisTemplate; private final OopService oopService; private final DistributedLocker distributedLocker; + private final StringRedisTemplate stringRedisTemplate; + @Value("${spring.cache.custom.global-prefix}:stand:pub") @Getter(AccessLevel.PRIVATE) private String keyPrefix; + @Value("${spring.cache.custom.global-prefix}:pub:distribute:fromClue") + @Getter(AccessLevel.PRIVATE) + private String fromClueCacheKey; + /** * 重置状态 */ @@ -69,6 +78,37 @@ public class PubStandTask { } } + /** + * 线索开始跟进后建立专属线索关系(如果能的话) + */ + @Scheduled(initialDelay = 1000 * 10, fixedRate = 1000 * 10) + public void dealFromClue() { + BoundListOperations listOps = stringRedisTemplate.boundListOps(getFromClueCacheKey()); + List failList = new ArrayList<>(); + String objectStr; + while ((objectStr = listOps.leftPop()) != null) { + if (!StringUtils.isEmpty(objectStr)) { + continue; + } + try { + PubCluePool cluePool = JSONObject.parseObject(objectStr, PubCluePool.class); + if (Objects.isNull(cluePool)) { + continue; + } + pubDistributeBizService.distributeFromClue(cluePool); + } catch (Exception e) { + if (StringUtils.isValid(objectStr)) { + failList.add(objectStr); + } + log.error("线索开始跟进后建立专属线索关系失败", e); + } + } + if (!CollectionUtils.isEmpty(failList)) { + String[] idArr = failList.toArray(new String[0]); + listOps.rightPushAll(idArr); + } + } + private void doDistribute(GroupDTO group) { final String key = generateKey(group.getId()); final String lockKey = String.format("pub:distribute:%s", group.getId()); diff --git a/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/follow/strategy/impl/ACFollowStrategy.java b/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/follow/strategy/impl/ACFollowStrategy.java index 97a7a68..dce3ab1 100644 --- a/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/follow/strategy/impl/ACFollowStrategy.java +++ b/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/follow/strategy/impl/ACFollowStrategy.java @@ -19,14 +19,17 @@ import cn.fw.valhalla.rpc.oop.dto.ShopDTO; import cn.fw.valhalla.rpc.shirasawa.dto.FollowInitDTO; import cn.fw.valhalla.service.bus.follow.strategy.AbstractFollowStrategy; import cn.fw.valhalla.service.data.AccidentPoolService; +import cn.fw.valhalla.service.event.ClueFromPublicEvent; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.time.Duration; import java.util.*; +import java.util.concurrent.CompletableFuture; import static cn.fw.common.businessvalidator.Validator.BV; import static cn.fw.valhalla.service.bus.setting.strategy.SettingStrategy.COMMON_BRAND_ID; @@ -42,10 +45,13 @@ import static cn.fw.valhalla.service.bus.setting.strategy.SettingStrategy.COMMON public class ACFollowStrategy extends AbstractFollowStrategy { private final AccidentPoolService accidentPoolService; + private final ApplicationEventPublisher eventPublisher; @Autowired - public ACFollowStrategy(final AccidentPoolService accidentPoolService) { + public ACFollowStrategy(final AccidentPoolService accidentPoolService, + final ApplicationEventPublisher eventPublisher) { this.accidentPoolService = accidentPoolService; + this.eventPublisher = eventPublisher; } @Override @@ -74,6 +80,16 @@ public class ACFollowStrategy extends AbstractFollowStrategy { BV.isNotEmpty(userByRole, () -> "该门店没有事故车跟进人员"); fillTaskUser(clueTask, userByRole); + if (StringUtils.isValid(followClue.getVin())) { + final ClueFromPublicEvent poolEvent = new ClueFromPublicEvent(); + poolEvent.setVin(followClue.getVin()); + poolEvent.setShopId(clueTask.getFollowShop()); + poolEvent.setGroupId(clueTask.getGroupId()); + poolEvent.setUserId(clueTask.getFollowUser()); + poolEvent.setType(PubStandType.AC); + CompletableFuture.runAsync(() -> eventPublisher.publishEvent(poolEvent)); + } + followClue.setClueState(ClueStatusEnum.ONGOING); clueTaskService.save(clueTask); final FollowInitDTO followInitDTO = creteFollowInitDTO(followClue, clueTask); diff --git a/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/follow/strategy/impl/IRFollowStrategy.java b/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/follow/strategy/impl/IRFollowStrategy.java index 72e1b39..b030266 100644 --- a/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/follow/strategy/impl/IRFollowStrategy.java +++ b/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/follow/strategy/impl/IRFollowStrategy.java @@ -16,16 +16,19 @@ import cn.fw.valhalla.rpc.oop.dto.ShopDTO; import cn.fw.valhalla.rpc.shirasawa.dto.FollowInitDTO; import cn.fw.valhalla.service.bus.follow.strategy.AbstractFollowStrategy; import cn.fw.valhalla.service.data.CustomerReachLogService; +import cn.fw.valhalla.service.event.ClueFromPublicEvent; import cn.hutool.core.collection.ListUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.*; +import java.util.concurrent.CompletableFuture; import static cn.fw.common.businessvalidator.Validator.BV; import static cn.fw.valhalla.service.bus.setting.strategy.SettingStrategy.COMMON_BRAND_ID; @@ -41,10 +44,13 @@ import static cn.fw.valhalla.service.bus.setting.strategy.SettingStrategy.COMMON @SuppressWarnings("Duplicates") public class IRFollowStrategy extends AbstractFollowStrategy { private final CustomerReachLogService customerReachLogService; + private final ApplicationEventPublisher eventPublisher; @Autowired - public IRFollowStrategy(final CustomerReachLogService customerReachLogService) { + public IRFollowStrategy(final CustomerReachLogService customerReachLogService, + final ApplicationEventPublisher eventPublisher) { this.customerReachLogService = customerReachLogService; + this.eventPublisher = eventPublisher; } @Override @@ -109,6 +115,15 @@ public class IRFollowStrategy extends AbstractFollowStrategy { } BV.isNotEmpty(userByRole, () -> String.format("该门店[mode: %s]没有【跟进】人员", mode)); fillTaskUser(clueTask, userByRole); + if (mode == 2 && Objects.isNull(customer.getAdviserId())) { + final ClueFromPublicEvent poolEvent = new ClueFromPublicEvent(); + poolEvent.setVin(customer.getFrameNo()); + poolEvent.setShopId(clueTask.getFollowShop()); + poolEvent.setUserId(clueTask.getFollowUser()); + poolEvent.setType(PubStandType.IR); + poolEvent.setGroupId(clueTask.getGroupId()); + CompletableFuture.runAsync(() -> eventPublisher.publishEvent(poolEvent)); + } clueTaskService.save(clueTask); followClue.setClueState(ClueStatusEnum.ONGOING); final FollowInitDTO followInitDTO = creteFollowInitDTO(followClue, clueTask); diff --git a/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/listener/ClueFromPublicListener.java b/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/listener/ClueFromPublicListener.java new file mode 100644 index 0000000..4238abc --- /dev/null +++ b/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/listener/ClueFromPublicListener.java @@ -0,0 +1,77 @@ +package cn.fw.valhalla.service.bus.listener; + +import cn.fw.valhalla.domain.db.pub.PubCluePool; +import cn.fw.valhalla.domain.enums.PubStandType; +import cn.fw.valhalla.domain.enums.PublicClueStateEnum; +import cn.fw.valhalla.service.bus.pub.PubDistributeBizService; +import cn.fw.valhalla.service.event.ClueFromPublicEvent; +import com.alibaba.fastjson.JSONObject; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.event.EventListener; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import java.time.LocalDate; + +/** + * 产生线索建立专属线索监听 + * + * @author : kurisu + * @version : 2.0 + * @className : ClueFromPublicListener + * @description : 产生线索建立专属线索监听 + * @date : 2023-04-26 11:05 + */ + +@Component +@Slf4j +public class ClueFromPublicListener { + private final PubDistributeBizService pubDistributeBizService; + private final StringRedisTemplate stringRedisTemplate; + + @Value("${spring.cache.custom.global-prefix}:pub:distribute:fromClue") + @Getter(AccessLevel.PRIVATE) + private String cacheKey; + + @Autowired + public ClueFromPublicListener(final PubDistributeBizService pubDistributeBizService, + final StringRedisTemplate stringRedisTemplate) { + this.pubDistributeBizService = pubDistributeBizService; + this.stringRedisTemplate = stringRedisTemplate; + } + + + /** + * 跟进线索产生时档案建立专属线索关系 + * + * @param event + */ + @EventListener(ClueFromPublicEvent.class) + public void stopTaskAndAddPublic(final ClueFromPublicEvent event) { + final String vin = event.getVin(); + final Long shopId = event.getShopId(); + final Long groupId = event.getShopId(); + final Long userId = event.getUserId(); + final PubStandType type = event.getType(); + + final PubCluePool pool = new PubCluePool(); + pool.setVin(vin); + pool.setStartTime(LocalDate.now()); + pool.setState(PublicClueStateEnum.ONGOING); + pool.setBegun(Boolean.FALSE); + pool.setSourceType(type); + pool.setAdviserId(userId); + pool.setShopId(shopId); + pool.setGroupId(groupId); + try { + pubDistributeBizService.distributeFromClue(pool); + } catch (Exception e) { + stringRedisTemplate.opsForList().rightPush(getCacheKey(), JSONObject.toJSONString(pool)); + log.error("跟进线索产生时档案建立专属线索关系失败", e); + } + } +} diff --git a/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/CustomEventListener.java b/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/listener/CustomEventListener.java index 6a594fa..188f2ad 100644 --- a/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/CustomEventListener.java +++ b/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/listener/CustomEventListener.java @@ -1,4 +1,4 @@ -package cn.fw.valhalla.service.bus; +package cn.fw.valhalla.service.bus.listener; import cn.fw.valhalla.domain.db.follow.ClueTask; import cn.fw.valhalla.domain.enums.FollowTypeEnum; diff --git a/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/pub/PubDistributeBizService.java b/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/pub/PubDistributeBizService.java index 90cc3cb..239eac2 100644 --- a/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/pub/PubDistributeBizService.java +++ b/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/pub/PubDistributeBizService.java @@ -6,12 +6,15 @@ import cn.fw.valhalla.domain.db.customer.AffiliationRecord; import cn.fw.valhalla.domain.db.customer.Customer; import cn.fw.valhalla.domain.db.follow.ClueTask; import cn.fw.valhalla.domain.db.follow.FollowClue; +import cn.fw.valhalla.domain.db.pool.PublicPool; import cn.fw.valhalla.domain.db.pool.StammkundePool; import cn.fw.valhalla.domain.db.pub.PubCluePool; import cn.fw.valhalla.domain.db.pub.PubStandStaffInfo; import cn.fw.valhalla.domain.enums.*; import cn.fw.valhalla.domain.vo.setting.SettingVO; +import cn.fw.valhalla.rpc.ehr.EhrRpcService; import cn.fw.valhalla.rpc.erp.UserService; +import cn.fw.valhalla.rpc.erp.dto.UserInfoDTO; import cn.fw.valhalla.rpc.erp.dto.UserRoleDataRangeDTO; import cn.fw.valhalla.rpc.mkt.MktRpcService; import cn.fw.valhalla.rpc.mkt.dto.QualificationDTO; @@ -50,6 +53,7 @@ import java.util.stream.Collectors; public class PubDistributeBizService { private final OopService oopService; private final UserService userService; + private final EhrRpcService ehrRpcService; private final FollowClueService followClueService; private final ClueTaskService clueTaskService; private final ShirasawaRpcService shirasawaRpcService; @@ -123,6 +127,39 @@ public class PubDistributeBizService { } /** + * 线索开始跟进后建立专属线索关系(如果能的话) + * + * @param pubClue + */ + @Transactional(rollbackFor = Exception.class) + public void distributeFromClue(final PubCluePool pubClue) { + Customer customer = customerService.queryByEngineNo(pubClue.getVin(), pubClue.getGroupId()); + if (Objects.isNull(customer)) { + return; + } + PublicPool publicPool = publicPoolService.queryByVin(pubClue.getVin(), pubClue.getGroupId()); + if (Objects.isNull(publicPool)) { + return; + } + if (Objects.nonNull(customer.getAdviserId())) { + return; + } + Optional settingVO = settingBizService.querySettingByType(FollowTypeEnum.OT, SettingTypeEnum.PUBLIC_VALID_DAY, pubClue.getGroupId(), null); + int publicValidDay = settingVO.map(SettingVO::getDetailValue).orElse(60); + pubClue.setDeadline(LocalDate.now().plusDays(publicValidDay)); + + UserInfoDTO user = ehrRpcService.user(pubClue.getAdviserId()); + if (Objects.nonNull(user)) { + pubClue.setAdviserName(user.getUserName()); + } + ShopDTO shop = oopService.shop(pubClue.getShopId()); + if (Objects.nonNull(shop)) { + pubClue.setShopName(shop.getShortName()); + } + createPubRelation(pubClue, customer.getId()); + } + + /** * 查询门店 * * @param staffInfo @@ -384,4 +421,26 @@ public class PubDistributeBizService { return true; } + private void createPubRelation(PubCluePool pool, Long customerId) { + Long staffId = pool.getAdviserId(); + Long shopId = pool.getShopId(); + Long groupId = pool.getGroupId(); + String vin = pool.getVin(); + + StammkundePool stammkundePool = new StammkundePool(); + stammkundePool.setCustomerId(customerId); + stammkundePool.setShopId(shopId); + stammkundePool.setGroupId(groupId); + stammkundePool.setAktiv(Boolean.FALSE); + stammkundePool.setCreateTime(new Date()); + stammkundePool.setAdviserId(staffId); + stammkundePool.setAdviserName(pool.getAdviserName()); + stammkundePool.setSources(StammkundeSourcesEnum.PUBLIC_POOL); + stammkundePool.setPoolStatus(StammkundeStatusEnum.PUBLIC); + + customerService.afterDistributePubClue(Collections.singletonList(vin), staffId, shopId, groupId); + pubCluePoolService.save(pool); + stammkundePoolService.save(stammkundePool); + publicPoolService.removeByVin(vin, groupId); + } } diff --git a/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/event/ClueFromPublicEvent.java b/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/event/ClueFromPublicEvent.java new file mode 100644 index 0000000..0b68c7a --- /dev/null +++ b/fw-valhalla-service/src/main/java/cn/fw/valhalla/service/event/ClueFromPublicEvent.java @@ -0,0 +1,22 @@ +package cn.fw.valhalla.service.event; + +import cn.fw.valhalla.domain.enums.PubStandType; +import lombok.Data; + +/** + * 产生线索是档案在公共池 + * + * @author : kurisu + * @version : 2.0 + * @className : ClueFromPublicEvent + * @description : 产生线索是档案在公共池 + * @date : 2023-04-26 10:37 + */ +@Data +public class ClueFromPublicEvent { + private String vin; + private Long userId; + private Long shopId; + private Long groupId; + private PubStandType type; +}