Blame view

fw-valhalla-service/src/main/java/cn/fw/valhalla/service/bus/follow/strategy/impl/PubFollowStrategy.java 16.4 KB
9de0e2d7   张志伟   feature(*): 公共池线索...
1
2
  package cn.fw.valhalla.service.bus.follow.strategy.impl;
  
3d6f8270   张志伟   feature(*): 公共池线索...
3
4
  import cn.fw.shirasawa.sdk.enums.BusinessTypeEnum;
  import cn.fw.shirasawa.sdk.enums.DataTypeEnum;
95f1b470   张志伟   feature(*): bug修复
5
  import cn.fw.shirasawa.sdk.enums.TerminationReason;
3d6f8270   张志伟   feature(*): 公共池线索...
6
  import cn.fw.valhalla.common.utils.DateUtil;
9de0e2d7   张志伟   feature(*): 公共池线索...
7
8
9
10
  import cn.fw.valhalla.domain.db.OriginalData;
  import cn.fw.valhalla.domain.db.follow.ClueTask;
  import cn.fw.valhalla.domain.db.follow.FollowClue;
  import cn.fw.valhalla.domain.db.pub.PubCluePool;
3d6f8270   张志伟   feature(*): 公共池线索...
11
12
13
  import cn.fw.valhalla.domain.dto.CustomerDetailDto;
  import cn.fw.valhalla.domain.enums.*;
  import cn.fw.valhalla.domain.vo.setting.SettingVO;
6f401c2d   张志伟   feature(*): 公共池完成逻辑
14
15
  import cn.fw.valhalla.rpc.ehr.EhrRpcService;
  import cn.fw.valhalla.rpc.ehr.dto.StaffInfoDTO;
3d6f8270   张志伟   feature(*): 公共池线索...
16
17
18
19
20
21
22
23
24
  import cn.fw.valhalla.rpc.oop.OopService;
  import cn.fw.valhalla.rpc.oop.dto.ShopDTO;
  import cn.fw.valhalla.rpc.shirasawa.ShirasawaRpcService;
  import cn.fw.valhalla.rpc.shirasawa.dto.ClueStopDTO;
  import cn.fw.valhalla.rpc.shirasawa.dto.FollowInitDTO;
  import cn.fw.valhalla.service.bus.cust.CustomerBizService;
  import cn.fw.valhalla.service.bus.follow.strategy.FollowStrategy;
  import cn.fw.valhalla.service.bus.setting.SettingBizService;
  import cn.fw.valhalla.service.data.ClueTaskService;
9de0e2d7   张志伟   feature(*): 公共池线索...
25
  import cn.fw.valhalla.service.data.PubCluePoolService;
8bf465d6   张志伟   feature(*): 修改人员站岗信息
26
  import com.baomidou.mybatisplus.core.toolkit.Wrappers;
9c86aa21   张志伟   feature(*): 线索到期后...
27
  import lombok.Getter;
9de0e2d7   张志伟   feature(*): 公共池线索...
28
29
  import lombok.extern.slf4j.Slf4j;
  import org.springframework.beans.factory.annotation.Autowired;
9c86aa21   张志伟   feature(*): 线索到期后...
30
31
  import org.springframework.beans.factory.annotation.Value;
  import org.springframework.data.redis.core.StringRedisTemplate;
9de0e2d7   张志伟   feature(*): 公共池线索...
32
33
34
  import org.springframework.stereotype.Component;
  import org.springframework.transaction.annotation.Transactional;
  
2a51fef7   张志伟   feature(*): 清理代码监...
35
  import java.time.Duration;
9de0e2d7   张志伟   feature(*): 公共池线索...
36
  import java.time.LocalDateTime;
3d6f8270   张志伟   feature(*): 公共池线索...
37
  import java.util.*;
9de0e2d7   张志伟   feature(*): 公共池线索...
38
39
  
  import static cn.fw.common.businessvalidator.Validator.BV;
3d6f8270   张志伟   feature(*): 公共池线索...
40
  import static cn.fw.valhalla.service.bus.setting.strategy.SettingStrategy.COMMON_BRAND_ID;
9de0e2d7   张志伟   feature(*): 公共池线索...
41
42
43
44
45
46
47
48
49
50
51
52
  
  /**
   * 公共池线索跟进
   *
   * @author : kurisu
   * @version : 1.0
   * @className : PubFollowStrategy
   * @description : 公共池线索跟进
   * @date : 2023-03-21 16:52
   */
  @Slf4j
  @Component
3d6f8270   张志伟   feature(*): 公共池线索...
53
  public class PubFollowStrategy implements FollowStrategy {
9de0e2d7   张志伟   feature(*): 公共池线索...
54
      private final PubCluePoolService pubCluePoolService;
3d6f8270   张志伟   feature(*): 公共池线索...
55
56
57
58
59
      private final ClueTaskService clueTaskService;
      private final CustomerBizService customerBizService;
      private final ShirasawaRpcService shirasawaRpcService;
      private final OopService oopService;
      private final SettingBizService settingBizService;
6f401c2d   张志伟   feature(*): 公共池完成逻辑
60
      private final EhrRpcService ehrRpcService;
9c86aa21   张志伟   feature(*): 线索到期后...
61
62
63
64
65
      private final StringRedisTemplate redisTemplate;
  
      @Value("${spring.cache.custom.global-prefix}:follow:clue:change:STOP")
      @Getter
      private String clueChangeKey;
9de0e2d7   张志伟   feature(*): 公共池线索...
66
67
  
      @Autowired
3d6f8270   张志伟   feature(*): 公共池线索...
68
69
70
71
72
      public PubFollowStrategy(final PubCluePoolService pubCluePoolService,
                               final ClueTaskService clueTaskService,
                               final CustomerBizService customerBizService,
                               final ShirasawaRpcService shirasawaRpcService,
                               final OopService oopService,
6f401c2d   张志伟   feature(*): 公共池完成逻辑
73
                               final SettingBizService settingBizService,
9c86aa21   张志伟   feature(*): 线索到期后...
74
75
                               final EhrRpcService ehrRpcService,
                               final StringRedisTemplate redisTemplate) {
9de0e2d7   张志伟   feature(*): 公共池线索...
76
          this.pubCluePoolService = pubCluePoolService;
3d6f8270   张志伟   feature(*): 公共池线索...
77
78
79
80
81
          this.clueTaskService = clueTaskService;
          this.customerBizService = customerBizService;
          this.shirasawaRpcService = shirasawaRpcService;
          this.oopService = oopService;
          this.settingBizService = settingBizService;
6f401c2d   张志伟   feature(*): 公共池完成逻辑
82
          this.ehrRpcService = ehrRpcService;
9c86aa21   张志伟   feature(*): 线索到期后...
83
          this.redisTemplate = redisTemplate;
9de0e2d7   张志伟   feature(*): 公共池线索...
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
      }
  
      @Override
      public FollowTypeEnum getFollowType() {
          return FollowTypeEnum.PL;
      }
  
      /**
       * 公共池线索跟进此方法无效
       *
       * @param originalData
       * @return
       */
      @Override
      public boolean origin2task(final OriginalData originalData) {
8bf465d6   张志伟   feature(*): 修改人员站岗信息
99
          // 公共池线索不存在这种场景
9de0e2d7   张志伟   feature(*): 公共池线索...
100
101
102
          return false;
      }
  
3d6f8270   张志伟   feature(*): 公共池线索...
103
104
105
106
107
108
      /**
       * 公共池线索跟进此方法无效
       *
       * @param followClue
       * @return
       */
9de0e2d7   张志伟   feature(*): 公共池线索...
109
110
      @Override
      public void startClue(final FollowClue followClue) {
2a51fef7   张志伟   feature(*): 清理代码监...
111
          // 公共池线索不存在这种场景
3d6f8270   张志伟   feature(*): 公共池线索...
112
      }
9de0e2d7   张志伟   feature(*): 公共池线索...
113
  
3d6f8270   张志伟   feature(*): 公共池线索...
114
115
116
117
118
119
      @Override
      public void settingChanged(List<SettingVO> setting, Long groupId) {
          // 更改设置不影响公共池线索跟进
      }
  
      @Override
2a51fef7   张志伟   feature(*): 清理代码监...
120
121
      public void forceStopClue(final FollowClue clue, final boolean fromTask) {
          // 公共池线索不存在这种场景
3d6f8270   张志伟   feature(*): 公共池线索...
122
123
      }
  
6f401c2d   张志伟   feature(*): 公共池完成逻辑
124
      @Transactional(rollbackFor = Exception.class)
3d6f8270   张志伟   feature(*): 公共池线索...
125
126
127
128
129
130
131
132
133
134
135
136
      public void startClue(final PubCluePool pubClue) {
          ClueTask clueTask = new ClueTask();
          clueTask.setClueId(pubClue.getId());
          clueTask.setType(getFollowType());
          clueTask.setBeginTime(pubClue.getStartTime().atStartOfDay());
          clueTask.setRedistribution(Boolean.FALSE);
          clueTask.setDeadline(pubClue.getDeadline().atStartOfDay());
          clueTask.setState(TaskStateEnum.ONGOING);
          clueTask.setGroupId(pubClue.getGroupId());
          clueTask.setFollowShop(pubClue.getShopId());
          clueTask.setFollowUser(pubClue.getAdviserId());
          clueTask.setFollowUserName(pubClue.getAdviserName());
89bd2e6c   张志伟   feature(*): 新增区域站...
137
          clueTask.setVersion(2);
3d6f8270   张志伟   feature(*): 公共池线索...
138
          clueTaskService.save(clueTask);
3d6f8270   张志伟   feature(*): 公共池线索...
139
          final FollowInitDTO followInitDTO = creteFollowInitDTO(pubClue, clueTask);
3d6f8270   张志伟   feature(*): 公共池线索...
140
          shirasawaRpcService.createFollowData(followInitDTO);
9de0e2d7   张志伟   feature(*): 公共池线索...
141
142
      }
  
6f401c2d   张志伟   feature(*): 公共池完成逻辑
143
144
145
146
147
      @Transactional(rollbackFor = Exception.class)
      public void clueConvertSuccess(final PubCluePool pubClue) {
          pubClue.setState(PublicClueStateEnum.COMPLETE);
          pubClue.setCloseTime(LocalDateTime.now());
  
8bf465d6   张志伟   feature(*): 修改人员站岗信息
148
          ClueTask clueTask = clueTaskService.queryOngoingTaskByClueId(pubClue.getId(), FollowTypeEnum.PL);
6f401c2d   张志伟   feature(*): 公共池完成逻辑
149
150
151
152
153
154
155
156
157
158
159
160
          if (Objects.nonNull(clueTask)) {
              clueTask.setCloseTime(LocalDateTime.now());
              clueTask.setFinishUser(pubClue.getAdviserId());
              StaffInfoDTO infoDTO = ehrRpcService.queryStaffInfo(pubClue.getAdviserId());
              if (Objects.nonNull(infoDTO)) {
                  clueTask.setFinishUserName(infoDTO.getName());
              }
              clueTask.setState(TaskStateEnum.COMPLETE);
              clueTask.setFinishShop(pubClue.getShopId());
              boolean rpcSucess = rpcStopTask(clueTask);
              clueTask.setRpcSuccess(rpcSucess);
              clueTaskService.updateById(clueTask);
9c86aa21   张志伟   feature(*): 线索到期后...
161
162
  
              redisTemplate.opsForSet().add(getClueChangeKey(), String.valueOf(clueTask.getId()));
6f401c2d   张志伟   feature(*): 公共池完成逻辑
163
164
165
166
167
168
169
170
          }
          pubCluePoolService.updateById(pubClue);
      }
  
      @Transactional(rollbackFor = Exception.class)
      public void clueConvertFailed(final PubCluePool pubClue, Long userId, Long shopId) {
          pubClue.setState(PublicClueStateEnum.DEFEAT);
          pubClue.setCloseTime(LocalDateTime.now());
8bf465d6   张志伟   feature(*): 修改人员站岗信息
171
          pubClue.setDefeatReason(TaskDefeatTypeEnum.F);
6f401c2d   张志伟   feature(*): 公共池完成逻辑
172
  
8bf465d6   张志伟   feature(*): 修改人员站岗信息
173
          ClueTask clueTask = clueTaskService.queryOngoingTaskByClueId(pubClue.getId(), FollowTypeEnum.PL);
6f401c2d   张志伟   feature(*): 公共池完成逻辑
174
175
176
177
178
179
180
181
182
183
184
185
186
          if (Objects.nonNull(clueTask)) {
              clueTask.setCloseTime(LocalDateTime.now());
              clueTask.setFinishUser(pubClue.getAdviserId());
              StaffInfoDTO infoDTO = ehrRpcService.queryStaffInfo(userId);
              if (Objects.nonNull(infoDTO)) {
                  clueTask.setFinishUserName(infoDTO.getName());
              }
              clueTask.setState(TaskStateEnum.DEFEAT);
              clueTask.setReason(TaskDefeatTypeEnum.F);
              clueTask.setFinishShop(shopId);
              boolean rpcSucess = rpcStopTask(clueTask);
              clueTask.setRpcSuccess(rpcSucess);
              clueTaskService.updateById(clueTask);
9c86aa21   张志伟   feature(*): 线索到期后...
187
188
  
              redisTemplate.opsForSet().add(getClueChangeKey(), String.valueOf(clueTask.getId()));
6f401c2d   张志伟   feature(*): 公共池完成逻辑
189
190
191
192
          }
          pubCluePoolService.updateById(pubClue);
      }
  
8bf465d6   张志伟   feature(*): 修改人员站岗信息
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
      /**
       * 审批而来的数据
       *
       * @param vin
       * @param groupId
       */
      @Transactional(rollbackFor = Exception.class)
      public void clueConvertFailedFromFlow(final String vin, final Long groupId) {
          PubCluePool cluePool = pubCluePoolService.getOne(Wrappers.<PubCluePool>lambdaQuery()
                          .eq(PubCluePool::getVin, vin)
                          .eq(PubCluePool::getGroupId, groupId)
                  , false);
          if (Objects.isNull(cluePool)) {
              return;
          }
8bf465d6   张志伟   feature(*): 修改人员站岗信息
208
  
ccd3fffa   张志伟   feature(*): bug修复
209
210
          Long clueId = cluePool.getId();
          ClueTask clueTask = clueTaskService.queryOngoingTaskByClueId(clueId, FollowTypeEnum.PL);
8bf465d6   张志伟   feature(*): 修改人员站岗信息
211
212
213
214
215
216
217
          if (Objects.nonNull(clueTask)) {
              clueTask.setCloseTime(LocalDateTime.now());
              clueTask.setState(TaskStateEnum.DEFEAT);
              clueTask.setReason(TaskDefeatTypeEnum.A);
              boolean rpcSucess = rpcStopTask(clueTask);
              clueTask.setRpcSuccess(rpcSucess);
              clueTaskService.updateById(clueTask);
9c86aa21   张志伟   feature(*): 线索到期后...
218
219
  
              redisTemplate.opsForSet().add(getClueChangeKey(), String.valueOf(clueTask.getId()));
8bf465d6   张志伟   feature(*): 修改人员站岗信息
220
221
          }
          if (PublicClueStateEnum.ONGOING.equals(cluePool.getState())) {
ccd3fffa   张志伟   feature(*): bug修复
222
223
224
              cluePool.setState(PublicClueStateEnum.DEFEAT);
              cluePool.setCloseTime(LocalDateTime.now());
              cluePool.setDefeatReason(TaskDefeatTypeEnum.A);
8bf465d6   张志伟   feature(*): 修改人员站岗信息
225
226
227
228
              pubCluePoolService.updateById(cluePool);
          }
      }
  
9de0e2d7   张志伟   feature(*): 公共池线索...
229
230
231
232
233
234
235
236
237
238
239
240
241
      @Override
      @Transactional(rollbackFor = Exception.class)
      public void onRoleChangeCloseTask(final ClueTask task) {
          task.setState(TaskStateEnum.DEFEAT);
          task.setCloseTime(LocalDateTime.now());
          task.setReason(TaskDefeatTypeEnum.D);
  
          boolean rpcSucess = rpcStopTask(task);
          if (!rpcSucess) {
              log.info("跟进系统终止任务失败");
          }
          task.setRpcSuccess(rpcSucess);
          clueTaskService.updateById(task);
9c86aa21   张志伟   feature(*): 线索到期后...
242
          redisTemplate.opsForSet().add(getClueChangeKey(), String.valueOf(task.getId()));
9de0e2d7   张志伟   feature(*): 公共池线索...
243
244
245
      }
  
      @Override
3d6f8270   张志伟   feature(*): 公共池线索...
246
      public void forceStopTask(final ClueTask task) {
2a51fef7   张志伟   feature(*): 清理代码监...
247
          // 公共池线索不存在这种场景
3d6f8270   张志伟   feature(*): 公共池线索...
248
249
      }
  
953745ee   张志伟   feature(*): 新增区域站...
250
251
252
253
254
255
      /**
       * 维护跟进次数
       *
       * @param clue    虚拟的跟进线索[只有id 和类型 其他信息没有]
       * @param overdue
       */
3d6f8270   张志伟   feature(*): 公共池线索...
256
      @Override
2a40e3f8   张志伟   feature(*): 续保跟进调整
257
      public void onFollowComplete(final FollowClue clue, final boolean overdue) {
8bf465d6   张志伟   feature(*): 修改人员站岗信息
258
          ClueTask task = clueTaskService.queryOngoingTaskByClueId(clue.getId(), FollowTypeEnum.PL);
2a40e3f8   张志伟   feature(*): 续保跟进调整
259
          if (!overdue && Objects.nonNull(task)) {
2a51fef7   张志伟   feature(*): 清理代码监...
260
261
262
263
              Integer times = Optional.ofNullable(task.getTimes()).orElse(0);
              task.setTimes(times + 1);
              clueTaskService.updateById(task);
          }
3d6f8270   张志伟   feature(*): 公共池线索...
264
265
266
267
      }
  
      @Override
      public void syncEndTask(final ClueTask task) {
2a51fef7   张志伟   feature(*): 清理代码监...
268
269
270
271
272
273
          if (TaskStateEnum.ONGOING.equals(task.getState())) {
              return;
          }
          boolean res = rpcStopTask(task);
          task.setRpcSuccess(res);
          clueTaskService.updateById(task);
3d6f8270   张志伟   feature(*): 公共池线索...
274
275
276
      }
  
      @Override
9de0e2d7   张志伟   feature(*): 公共池线索...
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
      @Transactional(rollbackFor = Exception.class)
      public void closeTask(final ClueTask task) {
          final Long clueId = task.getClueId();
          PubCluePool pubCluePool = pubCluePoolService.getById(clueId);
          BV.notNull(pubCluePool, () -> "公共池跟进线索不存在: " + clueId);
          task.setState(TaskStateEnum.DEFEAT);
          task.setCloseTime(task.getDeadline().minusSeconds(1L));
          task.setReason(TaskDefeatTypeEnum.C);
          boolean rpcSucess = rpcStopTask(task);
          if (!rpcSucess) {
              log.info("跟进系统终止任务失败");
          }
          task.setRpcSuccess(rpcSucess);
          clueTaskService.updateById(task);
          pubCluePool.setCloseTime(task.getCloseTime());
          pubCluePool.setState(PublicClueStateEnum.DEFEAT);
          pubCluePool.setDefeatReason(task.getReason());
          pubCluePoolService.updateById(pubCluePool);
9de0e2d7   张志伟   feature(*): 公共池线索...
295
          customerBizService.pubTaskEndAbandon(pubCluePool);
9c86aa21   张志伟   feature(*): 线索到期后...
296
          redisTemplate.opsForSet().add(getClueChangeKey(), String.valueOf(task.getId()));
9de0e2d7   张志伟   feature(*): 公共池线索...
297
      }
3d6f8270   张志伟   feature(*): 公共池线索...
298
299
300
301
302
  
      private boolean rpcStopTask(ClueTask clueTask) {
          ClueStopDTO clueStopDTO = new ClueStopDTO();
          clueStopDTO.setType(DataTypeEnum.ofValue(clueTask.getType().getValue()));
          clueStopDTO.setBusinessType(BusinessTypeEnum.AS);
2a40e3f8   张志伟   feature(*): 续保跟进调整
303
          clueStopDTO.setDetailId(String.valueOf(clueTask.getClueId()));
3d6f8270   张志伟   feature(*): 公共池线索...
304
305
306
307
308
309
310
311
312
          clueStopDTO.setShopId(clueTask.getFinishShop());
          ShopDTO shop = oopService.shop(clueTask.getFinishShop());
          if (Objects.nonNull(shop)) {
              clueStopDTO.setShopName(shop.getShortName());
          }
          clueStopDTO.setCompleteTime(DateUtil.localDateTime2Date(clueTask.getCloseTime()));
          clueStopDTO.setGroupId(clueTask.getGroupId());
          clueStopDTO.setUserId(clueTask.getFollowUser());
          clueStopDTO.setUserName(clueTask.getFollowUserName());
95f1b470   张志伟   feature(*): bug修复
313
314
315
316
317
318
319
320
321
322
323
324
325
326
          clueStopDTO.setReason(TerminationReason.ABANDON);
  
          if (TaskStateEnum.DEFEAT.equals(clueTask.getState())) {
              clueStopDTO.setTermination(Boolean.TRUE);
              if (TaskDefeatTypeEnum.A.equals(clueTask.getReason())) {
                  clueStopDTO.setReason(TerminationReason.ABANDON);
              }
              if (TaskDefeatTypeEnum.F.equals(clueTask.getReason())) {
                  clueStopDTO.setReason(TerminationReason.ANOTHER);
              }
              if (TaskDefeatTypeEnum.D.equals(clueTask.getReason())) {
                  clueStopDTO.setReason(TerminationReason.ROLE_CHANGE);
              }
          }
3d6f8270   张志伟   feature(*): 公共池线索...
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
          return shirasawaRpcService.stopTask(clueStopDTO);
      }
  
      private FollowInitDTO creteFollowInitDTO(PubCluePool pubClue, ClueTask clueTask) {
          CustomerDetailDto customerDetailDto = customerBizService.queryByFrameNo(pubClue.getVin(), pubClue.getGroupId());
          BV.notNull(customerDetailDto, () -> "档案信息有误");
  
          final FollowInitDTO followInitDTO = FollowInitDTO.builder()
                  .businessType(BusinessTypeEnum.AS)
                  .type(DataTypeEnum.ofValue(getFollowType().getValue()))
                  .customerId(customerDetailDto.getId())
                  .customerName(customerDetailDto.getName())
                  .memberId(customerDetailDto.getMemberId())
                  .plateNo(customerDetailDto.getPlateNo())
                  .frameNo(pubClue.getVin())
                  .contacts(customerDetailDto.getMobile())
2a40e3f8   张志伟   feature(*): 续保跟进调整
343
                  .detailId(String.valueOf(clueTask.getClueId()))
3d6f8270   张志伟   feature(*): 公共池线索...
344
345
346
347
348
349
350
                  .generateTime(DateUtil.localDateTime2Date(clueTask.getBeginTime()))
                  .deadline(DateUtil.localDateTime2Date(clueTask.getDeadline()))
                  .groupId(clueTask.getGroupId())
                  .shopId(clueTask.getFollowShop())
                  .userId(clueTask.getFollowUser())
                  .userName(clueTask.getFollowUserName())
                  .bizId(pubClue.getVin())
2a51fef7   张志伟   feature(*): 清理代码监...
351
                  .followDuration(Duration.ofHours(36L))
3d6f8270   张志伟   feature(*): 公共池线索...
352
353
                  .build();
          followInitDTO.setShopName(pubClue.getShopName());
3d6f8270   张志伟   feature(*): 公共池线索...
354
355
          Optional<SettingVO> setting = settingBizService.querySettingByType(FollowTypeEnum.OT, SettingTypeEnum.EFFECTIVE_TIME, clueTask.getGroupId(), COMMON_BRAND_ID);
          setting.ifPresent(r -> {
2a51fef7   张志伟   feature(*): 清理代码监...
356
357
358
359
360
361
              Integer unit = r.getUnit();
              int detailValue = Optional.ofNullable(r.getDetailValue()).orElse(0);
              Duration duration = transferDuration(detailValue, unit);
              BV.notNull(duration, () -> "设置有误,周期计算不成功");
              followInitDTO.setFollowDuration(duration);
          });
3d6f8270   张志伟   feature(*): 公共池线索...
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
          Map<String, String> noteMap = createNoteMap(pubClue, customerDetailDto);
          followInitDTO.setNoteMap(noteMap);
          return followInitDTO;
      }
  
  
      private Map<String, String> createNoteMap(PubCluePool pubClue, CustomerDetailDto detailDto) {
          Map<String, String> dynamicMap = new HashMap<>();
          if (Objects.nonNull(pubClue)) {
              int count = Optional.ofNullable(detailDto.getArrivalCount()).orElse(0);
              Date buyDate = detailDto.getBuyDate();
              Date expires = detailDto.getInsuranceExpires();
  
              String name = detailDto.getName();
              String vin = pubClue.getVin();
efdaf957   张志伟   feature(*): bug修复
377
              String plate = detailDto.getPlateNo();
3d6f8270   张志伟   feature(*): 公共池线索...
378
379
380
381
382
383
384
385
              String arrivalCount = String.valueOf(count);
              String defeatCount = "0";
              String vehicleAge = String.valueOf(Math.abs(DateUtil.sub(buyDate, new Date(), "y")));
              String _buyDate = DateUtil.getStringDateShort(buyDate);
              String insuranceExpires = DateUtil.getStringDateShort(expires);
  
              dynamicMap.put("name", name);
              dynamicMap.put("vin", vin);
efdaf957   张志伟   feature(*): bug修复
386
              dynamicMap.put("plate", plate);
3d6f8270   张志伟   feature(*): 公共池线索...
387
388
389
390
391
392
393
394
              dynamicMap.put("arrivalCount", arrivalCount);
              dynamicMap.put("defeatCount", defeatCount);
              dynamicMap.put("vehicleAge", vehicleAge + "年");
              dynamicMap.put("buyDate", _buyDate);
              dynamicMap.put("insuranceExpires", insuranceExpires);
          }
          return dynamicMap;
      }
9de0e2d7   张志伟   feature(*): 公共池线索...
395
  }