Commit d939bd030ca96b11119510e5c71b3a5c7a1980c7
1 parent
9d5da66f
feat:1.更新邮件提示,根据不同的客户编码重新设置邮件提示。
2.产品信息添加最新信息展示
Showing
11 changed files
with
320 additions
and
51 deletions
src/main/java/com/order/erp/common/constant/Constant.java
... | ... | @@ -343,5 +343,6 @@ public class Constant { |
343 | 343 | public static final String FINANCE_EVENT_TITLE_INNERNO = " , 对应内部编号为 : "; |
344 | 344 | |
345 | 345 | public static final String FINANCE_EVENT_TITLE_PROJECTNO = " , 对应项目号为 : "; |
346 | + public static final String ORDERBASEINFO_PRODUCTIONCOMMENT = " , 更新信息为 : "; | |
346 | 347 | |
347 | 348 | } | ... | ... |
src/main/java/com/order/erp/common/utils/DateUtils.java
... | ... | @@ -203,6 +203,15 @@ public class DateUtils { |
203 | 203 | } |
204 | 204 | |
205 | 205 | /** |
206 | + * 获取年月日 | |
207 | + * | |
208 | + */ | |
209 | + public static String getYearandMountandDay() { | |
210 | + LocalDateTime localDateTime = LocalDateTime.now(); | |
211 | + return localDateTime.getYear()+"-"+localDateTime.getMonthValue()+"-"+localDateTime.getDayOfMonth(); | |
212 | + } | |
213 | + | |
214 | + /** | |
206 | 215 | * 解析字符串日期为LocalDate |
207 | 216 | * |
208 | 217 | * @param dateStr | ... | ... |
src/main/java/com/order/erp/common/utils/EmailSendUtils.java
... | ... | @@ -37,7 +37,7 @@ public class EmailSendUtils { |
37 | 37 | private FreeMarkerConfigurer freeMarkerConfigurer; |
38 | 38 | |
39 | 39 | /** |
40 | - * @Description: 发送邮件 | |
40 | + * @Description: 发送邮件 发送尾期验货报告,中期验货报告,邮件提醒事件。 | |
41 | 41 | * @param emailTemplateEnum 邮件事件类型 |
42 | 42 | * @param receiveemailList 收件人邮箱 |
43 | 43 | * @param orderEventJobVO 订单基本信息,订单-质检信息,等。 |
... | ... | @@ -75,6 +75,49 @@ public class EmailSendUtils { |
75 | 75 | } |
76 | 76 | javaMailSender.send(mimeMessage); |
77 | 77 | } |
78 | + | |
79 | + /** | |
80 | + * @Description: 发送邮件 只发送产品信息。 | |
81 | + * @param emailTemplateEnum 邮件事件类型 | |
82 | + * @param receiveemailList 收件人邮箱 | |
83 | + * @param orderEventJobVO 订单基本信息,订单-质检信息,等。 | |
84 | + * @Param extraString 每次更新的产品信息。 | |
85 | + * @throws MessagingException | |
86 | + * @throws IOException | |
87 | + */ | |
88 | + | |
89 | + public void sendEmail(EmailTemplateEnum emailTemplateEnum, List<String> receiveemailList, OrderEventJobVO orderEventJobVO,String extraString) { | |
90 | + if(CollectionUtils.isEmpty(receiveemailList) && emailTemplateEnum ==null && ObjectUtils.isNull(orderEventJobVO)){ | |
91 | + throw new BusinessException(ServerResultCode.PARAM_ERROR); | |
92 | + } | |
93 | + MimeMessage mimeMessage = javaMailSender.createMimeMessage(); | |
94 | + MimeMessageHelper helper= null; | |
95 | + Map<String, Object> map = new HashMap<>(); | |
96 | + map.put("context",emailTemplateEnum.getContent()+orderEventJobVO.getBaseInfo().getProjectNo()+Constant.ORDERBASEINFO_PRODUCTIONCOMMENT+extraString); | |
97 | + map.put("title",emailTemplateEnum.getTitle()); | |
98 | + map.put("data",orderEventJobVO); | |
99 | + Template template = null; | |
100 | + //设置收件人 | |
101 | + String[] receiveemailListArray = receiveemailList.toArray(new String[receiveemailList.size()]); | |
102 | + try { | |
103 | + helper = new MimeMessageHelper(mimeMessage,true); | |
104 | + //设置邮件的主题 | |
105 | + helper.setSubject(emailTemplateEnum.getTitle()); | |
106 | + //设置发件人 | |
107 | + helper.setFrom(sendEmail); | |
108 | + helper.setTo(receiveemailListArray); | |
109 | + helper.setSentDate(new Date()); | |
110 | + template = freeMarkerConfigurer.getConfiguration().getTemplate("mail.ftl"); | |
111 | + StringWriter stringWriter = new StringWriter(); | |
112 | + template.process(map,stringWriter); | |
113 | + helper.setText(stringWriter.toString(),true); | |
114 | + } catch (TemplateException | IOException | MessagingException e) { | |
115 | + throw new RuntimeException("邮件发送失败!"); | |
116 | + } | |
117 | + javaMailSender.send(mimeMessage); | |
118 | + } | |
119 | + | |
120 | + | |
78 | 121 | /** |
79 | 122 | * @Description: 发送生产指示书邮件 |
80 | 123 | * @param emailTemplateEnum 邮件事件类型 | ... | ... |
src/main/java/com/order/erp/controller/InvoiceBillOrderController.java
... | ... | @@ -75,7 +75,7 @@ public class InvoiceBillOrderController { |
75 | 75 | @PostMapping(value = "/export") |
76 | 76 | @ApiOperation("导出分析列表") |
77 | 77 | @AnonymousAccess |
78 | - public void export(HttpServletResponse response, @RequestBody @Validated InvoiceAndCheckAnalysisVO queryVO) throws IOException, Excel4JException { | |
78 | + public void export(HttpServletResponse response, @RequestBody InvoiceAndCheckAnalysisVO queryVO) throws IOException, Excel4JException { | |
79 | 79 | invoiceBillOrderService.export(response, queryVO); |
80 | 80 | } |
81 | 81 | ... | ... |
src/main/java/com/order/erp/job/OrderJob.java
... | ... | @@ -63,7 +63,7 @@ public class OrderJob { |
63 | 63 | .le(OrderBaseInfoDO::getCreateTime, DateUtils.format(DateTime.now().toDate(), DateUtils.DATE_TIME)) |
64 | 64 | .ne(OrderBaseInfoDO::getOrderStatus, OrderStatusEnum.ORDER_FINISH.getStatus()); |
65 | 65 | List<OrderBaseInfoDO> ordersDOS = orderBaseInfoService.list(queryWrapper); |
66 | - | |
66 | +//如果都填充完成为 1.25,如果只填写4个,则为1。 | |
67 | 67 | List<OrderInfoResultVO> orderInfoResultVOS = orderBaseInfoService.wrapperOrderResultList(false, ordersDOS); |
68 | 68 | if (CollectionUtils.isNotEmpty(orderInfoResultVOS)) { |
69 | 69 | Set<Long> orderIds = orderInfoResultVOS.stream().filter(x -> Objects.nonNull(x.getSchedule()) && Constant.ONE == x.getSchedule()).map(OrderInfoResultVO::getId).collect(Collectors.toSet()); | ... | ... |
src/main/java/com/order/erp/job/OrderOverTimeEventJob.java
... | ... | @@ -103,6 +103,7 @@ public class OrderOverTimeEventJob { |
103 | 103 | private void sendEmail4OrderEvent(OrderEventEnum eventEnum, List<OrderEventJobVO> eventJobVOS) { |
104 | 104 | HashSet<String> customerCodeList = new HashSet<>(); |
105 | 105 | for (OrderEventJobVO orderEventJob : eventJobVOS) { |
106 | + //这里虽然没有使用redis限制住订单id,但是限制住了客户编码,要是发现redis中有发送的订单,就会设置客户编码是"",查询不出来邮件,所以就不会发送邮箱。要是没有,则会设置客户编码,会去查询。 | |
106 | 107 | if (!redisUtils.hasKey(EmailTemplateEnum.byTemplate( |
107 | 108 | eventEnum.getTemplateId()) + Constant.CROSS_BAR_CHARACTER + orderEventJob.getBaseInfo().getId())) { |
108 | 109 | customerCodeList.add(orderEventJob.getBaseInfo().getCustomerCode()); |
... | ... | @@ -302,28 +303,174 @@ public class OrderOverTimeEventJob { |
302 | 303 | */ |
303 | 304 | private Map<String, OrderEventJobVO> groupByOrderEvent(OrderEventJobVO eventJobVO) { |
304 | 305 | Map<String, OrderEventJobVO> map = new HashMap<>(); |
305 | - if (filterConfirmSampleOrderEvent(eventJobVO)) { | |
306 | - map.put(OrderEventEnum.CONFIRM_SAMPLE_EVENT.getEvent(), eventJobVO); | |
307 | - } | |
308 | - if (filterOtherSampleEvent(eventJobVO)) { | |
309 | - map.put(OrderEventEnum.OTHER_SAMPLE_EVENT.getEvent(), eventJobVO); | |
310 | - } | |
311 | - if (filterBigSampleEvent(eventJobVO)) { | |
312 | - map.put(OrderEventEnum.BIG_SAMPLE_EVENT.getEvent(), eventJobVO); | |
313 | - } | |
314 | - if (filterAITEXSGSTestEvent(eventJobVO)) { | |
315 | - map.put(OrderEventEnum.AITEX_SGS_TEST_EVENT.getEvent(), eventJobVO); | |
316 | - } | |
317 | - if (filterBarcodeArrivalEvent(eventJobVO)) { | |
318 | - map.put(OrderEventEnum.BARCODE_ARRIVAL_EVENT.getEvent(), eventJobVO); | |
319 | - } | |
320 | - if (filterLatestDCEvent(eventJobVO)) { | |
321 | - map.put(OrderEventEnum.LATEST_DC_EVENT.getEvent(), eventJobVO); | |
322 | - } | |
323 | - if (filterEndCheckDateEvent(eventJobVO)) { | |
324 | - map.put(OrderEventEnum.END_CHECK_DATE_EVENT.getEvent(), eventJobVO); | |
306 | + //如果包含"-",则去掉。 A04没有处理,然后A06,A09,A08,对于返单数据,只写了订舱和包材事件,对于返单的内销是否需要订舱和包材。 | |
307 | + String simpleCustomerCode = eventJobVO.getBaseInfo().getCustomerCode().substring(0, 3); | |
308 | + //把返单和不是返单分别区分。 | |
309 | + if(StringUtils.isEmpty(eventJobVO.getBaseInfo().getReturnOrder())){ | |
310 | + return map; | |
311 | + }else{ | |
312 | + // 不是返单。 | |
313 | + if(Constant.ZERO_STRING.equals(eventJobVO.getBaseInfo().getReturnOrder())){ | |
314 | + if("A06".equals(simpleCustomerCode) || "A09".equals(simpleCustomerCode)){ | |
315 | + //如果运输方式为SF则代表内销。 | |
316 | + boolean isOutboundTypeSF=eventJobVO.getBaseInfo().getOutboundType().equals("SF"); | |
317 | + if (filterSGSTestEvent(eventJobVO)) { | |
318 | + map.put(OrderEventEnum.AITEX_SGS_TEST_EVENT.getEvent(), eventJobVO); | |
319 | + } | |
320 | + if(!isOutboundTypeSF){ | |
321 | + if (filterConfirmSampleOrderEvent(eventJobVO)) { | |
322 | + map.put(OrderEventEnum.CONFIRM_SAMPLE_EVENT.getEvent(), eventJobVO); | |
323 | + } | |
324 | + if (filterBigSampleEvent(eventJobVO)) { | |
325 | + map.put(OrderEventEnum.BIG_SAMPLE_EVENT.getEvent(), eventJobVO); | |
326 | + } | |
327 | + if (filterBarcodeArrivalEvent(eventJobVO)) { | |
328 | + map.put(OrderEventEnum.BARCODE_ARRIVAL_EVENT.getEvent(), eventJobVO); | |
329 | + } | |
330 | + if (filterLatestDCEvent(eventJobVO)) { | |
331 | + map.put(OrderEventEnum.LATEST_DC_EVENT.getEvent(), eventJobVO); | |
332 | + } | |
333 | + } | |
334 | + }else if("A05".equals(simpleCustomerCode) || "A07".equals(simpleCustomerCode) || "M05".equals(simpleCustomerCode) || "M03".equals(simpleCustomerCode)){ | |
335 | + //如果出库类型为POST则代表样品单,不需要订舱。 | |
336 | + boolean isOutboundTypePOST = eventJobVO.getBaseInfo().getOutboundType().equals("POST"); | |
337 | + | |
338 | + if (filterConfirmSampleOrderEvent(eventJobVO)) { | |
339 | + map.put(OrderEventEnum.CONFIRM_SAMPLE_EVENT.getEvent(), eventJobVO); | |
340 | + } | |
341 | + if (filterBigSampleEvent(eventJobVO)) { | |
342 | + map.put(OrderEventEnum.BIG_SAMPLE_EVENT.getEvent(), eventJobVO); | |
343 | + } | |
344 | + if (filterBarcodeArrivalEvent(eventJobVO)) { | |
345 | + map.put(OrderEventEnum.BARCODE_ARRIVAL_EVENT.getEvent(), eventJobVO); | |
346 | + } | |
347 | + if (filterSGSTestEvent(eventJobVO)) { | |
348 | + map.put(OrderEventEnum.AITEX_SGS_TEST_EVENT.getEvent(), eventJobVO); | |
349 | + } | |
350 | + if(!isOutboundTypePOST){ | |
351 | + if (filterLatestDCEvent(eventJobVO)) { | |
352 | + map.put(OrderEventEnum.LATEST_DC_EVENT.getEvent(), eventJobVO); | |
353 | + } | |
354 | + } | |
355 | + }else if("A01".equals(simpleCustomerCode)){ | |
356 | + if (filterConfirmSampleOrderEvent(eventJobVO)) { | |
357 | + map.put(OrderEventEnum.CONFIRM_SAMPLE_EVENT.getEvent(), eventJobVO); | |
358 | + } | |
359 | + if (filterOtherSampleEvent(eventJobVO)) { | |
360 | + map.put(OrderEventEnum.OTHER_SAMPLE_EVENT.getEvent(), eventJobVO); | |
361 | + } | |
362 | + if (filterBigSampleEvent(eventJobVO)) { | |
363 | + map.put(OrderEventEnum.BIG_SAMPLE_EVENT.getEvent(), eventJobVO); | |
364 | + } | |
365 | + if (filterBarcodeArrivalEvent(eventJobVO)) { | |
366 | + map.put(OrderEventEnum.BARCODE_ARRIVAL_EVENT.getEvent(), eventJobVO); | |
367 | + } | |
368 | + if (filterSGSTestEvent(eventJobVO)) { | |
369 | + map.put(OrderEventEnum.AITEX_SGS_TEST_EVENT.getEvent(), eventJobVO); | |
370 | + } | |
371 | + if(filterAITEXTestEvent(eventJobVO)){ | |
372 | + map.put(OrderEventEnum.AITEX_SGS_TEST_EVENT.getEvent(), eventJobVO); | |
373 | + } | |
374 | + if (filterLatestDCEvent(eventJobVO)) { | |
375 | + map.put(OrderEventEnum.LATEST_DC_EVENT.getEvent(), eventJobVO); | |
376 | + } | |
377 | + }else if("A04".equals(simpleCustomerCode)){ | |
378 | + if (filterConfirmSampleOrderEvent(eventJobVO)) { | |
379 | + map.put(OrderEventEnum.CONFIRM_SAMPLE_EVENT.getEvent(), eventJobVO); | |
380 | + } | |
381 | + if (filterBigSampleEvent(eventJobVO)) { | |
382 | + map.put(OrderEventEnum.BIG_SAMPLE_EVENT.getEvent(), eventJobVO); | |
383 | + } | |
384 | + if (filterBarcodeArrivalEvent(eventJobVO)) { | |
385 | + map.put(OrderEventEnum.BARCODE_ARRIVAL_EVENT.getEvent(), eventJobVO); | |
386 | + } | |
387 | + if (filterSGSTestEvent(eventJobVO)) { | |
388 | + map.put(OrderEventEnum.AITEX_SGS_TEST_EVENT.getEvent(), eventJobVO); | |
389 | + } | |
390 | + if (filterLatestDCEvent(eventJobVO)) { | |
391 | + map.put(OrderEventEnum.LATEST_DC_EVENT.getEvent(), eventJobVO); | |
392 | + } | |
393 | + }//除了上述几种,其他的都全部走一遍。 先注释掉。 | |
394 | + /* else{ | |
395 | + if (filterConfirmSampleOrderEvent(eventJobVO)) { | |
396 | + map.put(OrderEventEnum.CONFIRM_SAMPLE_EVENT.getEvent(), eventJobVO); | |
397 | + } | |
398 | + if (filterOtherSampleEvent(eventJobVO)) { | |
399 | + map.put(OrderEventEnum.OTHER_SAMPLE_EVENT.getEvent(), eventJobVO); | |
400 | + } | |
401 | + if (filterBigSampleEvent(eventJobVO)) { | |
402 | + map.put(OrderEventEnum.BIG_SAMPLE_EVENT.getEvent(), eventJobVO); | |
403 | + } | |
404 | + if (filterBarcodeArrivalEvent(eventJobVO)) { | |
405 | + map.put(OrderEventEnum.BARCODE_ARRIVAL_EVENT.getEvent(), eventJobVO); | |
406 | + } | |
407 | + if (filterSGSTestEvent(eventJobVO)) { | |
408 | + map.put(OrderEventEnum.AITEX_SGS_TEST_EVENT.getEvent(), eventJobVO); | |
409 | + } | |
410 | + if(filterAITEXTestEvent(eventJobVO)){ | |
411 | + map.put(OrderEventEnum.AITEX_SGS_TEST_EVENT.getEvent(), eventJobVO); | |
412 | + } | |
413 | + if (filterLatestDCEvent(eventJobVO)) { | |
414 | + map.put(OrderEventEnum.LATEST_DC_EVENT.getEvent(), eventJobVO); | |
415 | + } | |
416 | + }*/ | |
417 | + }else{ | |
418 | + //返单。 | |
419 | + if("A05".equals(simpleCustomerCode) || "A07".equals(simpleCustomerCode) || "M05".equals(simpleCustomerCode) || "M03".equals(simpleCustomerCode)){ | |
420 | + boolean isOutboundTypePOST = eventJobVO.getBaseInfo().getOutboundType().equals("POST"); | |
421 | + if (filterBarcodeArrivalEvent(eventJobVO)) { | |
422 | + map.put(OrderEventEnum.BARCODE_ARRIVAL_EVENT.getEvent(), eventJobVO); | |
423 | + } | |
424 | + if(!isOutboundTypePOST){ | |
425 | + if (filterLatestDCEvent(eventJobVO)) { | |
426 | + map.put(OrderEventEnum.LATEST_DC_EVENT.getEvent(), eventJobVO); | |
427 | + } | |
428 | + } | |
429 | + }else if("A06".equals(simpleCustomerCode) || "A09".equals(simpleCustomerCode) || "A04".equals(simpleCustomerCode)){ | |
430 | + if (filterLatestDCEvent(eventJobVO)) { | |
431 | + map.put(OrderEventEnum.LATEST_DC_EVENT.getEvent(), eventJobVO); | |
432 | + } | |
433 | + if (filterBarcodeArrivalEvent(eventJobVO)) { | |
434 | + map.put(OrderEventEnum.BARCODE_ARRIVAL_EVENT.getEvent(), eventJobVO); | |
435 | + } | |
436 | + }else if("A01".equals(simpleCustomerCode)){ | |
437 | + | |
438 | + if (filterBigSampleEvent(eventJobVO)) { | |
439 | + map.put(OrderEventEnum.BIG_SAMPLE_EVENT.getEvent(), eventJobVO); | |
440 | + } | |
441 | + if (filterLatestDCEvent(eventJobVO)) { | |
442 | + map.put(OrderEventEnum.LATEST_DC_EVENT.getEvent(), eventJobVO); | |
443 | + } | |
444 | + if (filterLatestDCEvent(eventJobVO)) { | |
445 | + map.put(OrderEventEnum.LATEST_DC_EVENT.getEvent(), eventJobVO); | |
446 | + } | |
447 | + }//除了上述几种,其他的都全部走一遍。先注释掉。 | |
448 | + /* else{ | |
449 | + if (filterConfirmSampleOrderEvent(eventJobVO)) { | |
450 | + map.put(OrderEventEnum.CONFIRM_SAMPLE_EVENT.getEvent(), eventJobVO); | |
451 | + } | |
452 | + if (filterOtherSampleEvent(eventJobVO)) { | |
453 | + map.put(OrderEventEnum.OTHER_SAMPLE_EVENT.getEvent(), eventJobVO); | |
454 | + } | |
455 | + if (filterBigSampleEvent(eventJobVO)) { | |
456 | + map.put(OrderEventEnum.BIG_SAMPLE_EVENT.getEvent(), eventJobVO); | |
457 | + } | |
458 | + if (filterBarcodeArrivalEvent(eventJobVO)) { | |
459 | + map.put(OrderEventEnum.BARCODE_ARRIVAL_EVENT.getEvent(), eventJobVO); | |
460 | + } | |
461 | + if (filterSGSTestEvent(eventJobVO)) { | |
462 | + map.put(OrderEventEnum.AITEX_SGS_TEST_EVENT.getEvent(), eventJobVO); | |
463 | + } | |
464 | + if(filterAITEXTestEvent(eventJobVO)){ | |
465 | + map.put(OrderEventEnum.AITEX_SGS_TEST_EVENT.getEvent(), eventJobVO); | |
466 | + } | |
467 | + if (filterLatestDCEvent(eventJobVO)) { | |
468 | + map.put(OrderEventEnum.LATEST_DC_EVENT.getEvent(), eventJobVO); | |
469 | + } | |
470 | + }*/ | |
471 | + } | |
472 | + return map; | |
325 | 473 | } |
326 | - return map; | |
327 | 474 | } |
328 | 475 | |
329 | 476 | /** |
... | ... | @@ -379,7 +526,7 @@ public class OrderOverTimeEventJob { |
379 | 526 | } |
380 | 527 | |
381 | 528 | |
382 | - private Boolean filterAITEXSGSTestEvent(OrderEventJobVO eventJobVO) { | |
529 | + /* private Boolean filterAITEXSGSTestEvent(OrderEventJobVO eventJobVO) { | |
383 | 530 | int aitextestDaysBetween = 0; |
384 | 531 | int sgstestDaysBetween = 0; |
385 | 532 | String orderHodTime = eventJobVO.getBaseInfo().getOrderHodTime(); |
... | ... | @@ -405,6 +552,48 @@ public class OrderOverTimeEventJob { |
405 | 552 | } |
406 | 553 | return false; |
407 | 554 | |
555 | + }*/ | |
556 | + | |
557 | + private Boolean filterAITEXTestEvent(OrderEventJobVO eventJobVO) { | |
558 | + int aitextestDaysBetween = 0; | |
559 | + String orderHodTime = eventJobVO.getBaseInfo().getOrderHodTime(); | |
560 | + String aitexTestFinishResult = eventJobVO.getTrackStageInfo().getAitexTestFinishResult(); | |
561 | + String aitexTestFinishTime = eventJobVO.getTrackStageInfo().getAitexTestFinishTime(); | |
562 | + | |
563 | + if (StringUtils.isNotBlank(orderHodTime) && StringUtils.isNotBlank(aitexTestFinishResult) && StringUtils.isNotBlank(aitexTestFinishTime)) { | |
564 | + aitextestDaysBetween = getDaysBetween(aitexTestFinishResult, aitexTestFinishTime, orderHodTime); | |
565 | + } | |
566 | + | |
567 | + if (StringUtils.isEmpty(aitexTestFinishResult)) { | |
568 | + LocalDate today = LocalDate.now(); | |
569 | + LocalDate localDate = DateUtils.parseDate(orderHodTime); | |
570 | + if (Constant.THREE == (int) ChronoUnit.DAYS.between(today, localDate)) { | |
571 | + return true; | |
572 | + } | |
573 | + } | |
574 | + | |
575 | + return Constant.THREE == aitextestDaysBetween || Constant.NEGATIVE_ONE == aitextestDaysBetween; | |
576 | + } | |
577 | + | |
578 | + private Boolean filterSGSTestEvent(OrderEventJobVO eventJobVO) { | |
579 | + int sgstestDaysBetween = 0; | |
580 | + String orderHodTime = eventJobVO.getBaseInfo().getOrderHodTime(); | |
581 | + String sgsTestFinishResult = eventJobVO.getTrackStageInfo().getSgsTestFinishResult(); | |
582 | + String sgsTestFinishTime = eventJobVO.getTrackStageInfo().getSgsTestFinishTime(); | |
583 | + | |
584 | + if (StringUtils.isNotBlank(orderHodTime) && StringUtils.isNotBlank(sgsTestFinishResult) && StringUtils.isNotBlank(sgsTestFinishTime)) { | |
585 | + sgstestDaysBetween = getDaysBetween(sgsTestFinishResult, sgsTestFinishTime, orderHodTime); | |
586 | + } | |
587 | + | |
588 | + if (StringUtils.isEmpty(sgsTestFinishResult)) { | |
589 | + LocalDate today = LocalDate.now(); | |
590 | + LocalDate localDate = DateUtils.parseDate(orderHodTime); | |
591 | + if (Constant.THREE == (int) ChronoUnit.DAYS.between(today, localDate)) { | |
592 | + return true; | |
593 | + } | |
594 | + } | |
595 | + | |
596 | + return Constant.THREE == sgstestDaysBetween || Constant.NEGATIVE_ONE == sgstestDaysBetween; | |
408 | 597 | } |
409 | 598 | |
410 | 599 | ... | ... |
src/main/java/com/order/erp/service/order/impl/InvoiceBillOrderServiceImpl.java
... | ... | @@ -390,6 +390,7 @@ public class InvoiceBillOrderServiceImpl extends ServiceImpl<InvoiceBillOrderMap |
390 | 390 | queryVO.getQueryVO().setProductionDepartmentConsignEndTime(queryVO.getQueryVO().getProductionDepartmentConsignEndTime().substring(0,10)+" 23:59:59"); |
391 | 391 | } |
392 | 392 | Set<Long> existOrderIdSet=new HashSet<>(); |
393 | + Set<Long> filterDoubleOrderIds = new HashSet<>(); | |
393 | 394 | //查询数据 |
394 | 395 | List<InvoiceIdAndCheckIdResultVO> idResultVOS = baseMapper.byQuerygetInvoiceIdAndCheckId(queryVO.getQueryVO()); |
395 | 396 | List<Long> invoiceIds = idResultVOS.stream().map(x -> x.getInvoiceId()).filter(Objects::nonNull).collect(Collectors.toList()); |
... | ... | @@ -401,7 +402,8 @@ public class InvoiceBillOrderServiceImpl extends ServiceImpl<InvoiceBillOrderMap |
401 | 402 | List<Long> existOrderIds = invoiceBillOrderDOS.stream().map(x -> x.getOrderId()).collect(Collectors.toList()); |
402 | 403 | existOrderIdSet.addAll(existOrderIds); |
403 | 404 | List<Long> orderIdList = idResultVOS.stream().map(x -> x.getOrderId()).collect(Collectors.toList()); |
404 | - notExistOrderIds = orderIdList.stream() | |
405 | + filterDoubleOrderIds.addAll(orderIdList); | |
406 | + notExistOrderIds = filterDoubleOrderIds.stream() | |
405 | 407 | .filter(orderId -> !existOrderIdSet.contains(orderId)) |
406 | 408 | .collect(Collectors.toList()); |
407 | 409 | |
... | ... | @@ -1327,6 +1329,7 @@ public class InvoiceBillOrderServiceImpl extends ServiceImpl<InvoiceBillOrderMap |
1327 | 1329 | List<OrderBaseInfoDO> orderBaseInfoDOS = orderBaseInfoDOList.stream().map(order -> { |
1328 | 1330 | //这里要删除对应invoiceNo号,但是为了删除后产生空指针异常,所以定义为"N/N"; |
1329 | 1331 | order.setInvoiceNo("N/N"); |
1332 | + order.setInvoiceStatus(FinanceEnum.NOT_CREATED.getStatus()); | |
1330 | 1333 | return order; |
1331 | 1334 | }).collect(Collectors.toList()); |
1332 | 1335 | transactionHelper.run(() -> { |
... | ... | @@ -1416,17 +1419,19 @@ public class InvoiceBillOrderServiceImpl extends ServiceImpl<InvoiceBillOrderMap |
1416 | 1419 | //第二行 |
1417 | 1420 | Row row2 = sheet.createRow(3); |
1418 | 1421 | Cell cell2 = row2.createCell(0); |
1419 | - cell2.setCellValue("提交人:"+queryVO.getFinancePerson()); | |
1422 | + cell2.setCellValue("提交人:"+queryVO.getTrackerUser()); | |
1420 | 1423 | sheet.addMergedRegion(new CellRangeAddress(3, 4, 0, 1)); |
1421 | 1424 | Cell cell3 = row2.createCell(2); |
1422 | 1425 | cell3.setCellValue(""); |
1423 | 1426 | sheet.addMergedRegion(new CellRangeAddress(3, 4, 2, 7)); |
1424 | 1427 | Cell cell4 = row2.createCell(8); |
1425 | - if(StringUtils.isNotBlank(queryVO.getActualRefundDate())){ | |
1428 | + /*if(StringUtils.isNotBlank(queryVO.getActualRefundDate())){ | |
1426 | 1429 | cell4.setCellValue("日期:"+queryVO.getActualRefundDate()); |
1427 | 1430 | }else{ |
1428 | 1431 | cell4.setCellValue("日期:"); |
1429 | - } | |
1432 | + }*/ | |
1433 | + //改为 变成当前的年月日。 | |
1434 | + cell4.setCellValue("日期:"+DateUtils.getYearandMountandDay()); | |
1430 | 1435 | sheet.addMergedRegion(new CellRangeAddress(3, 4, 8, 9)); |
1431 | 1436 | //第三行 |
1432 | 1437 | createMergedCell(sheet, workbook, 5, 0, 5, 6, 0, 1, "INVOICE编号"); |
... | ... | @@ -1443,7 +1448,7 @@ public class InvoiceBillOrderServiceImpl extends ServiceImpl<InvoiceBillOrderMap |
1443 | 1448 | createMergedCell(sheet, workbook, 7, 5, 7, 8, 5, 6, queryVO.getTotalPayAmount()!=null ? "$"+queryVO.getTotalPayAmount().setScale(2, BigDecimal.ROUND_HALF_UP) : ""); |
1444 | 1449 | createMergedCell(sheet, workbook, 7, 7, 7, 8, 7, 7, queryVO.getOtherAmount() != null ? "$"+queryVO.getOtherAmount().setScale(2, BigDecimal.ROUND_HALF_UP) : ""); |
1445 | 1450 | createMergedCell(sheet, workbook, 7, 8, 7, 8, 8, 8, queryVO.getBackRefundDate() != null ? queryVO.getBackRefundDate() : ""); |
1446 | - createMergedCell(sheet, workbook, 7, 9, 7, 8, 9, 9, queryVO.getActualRefundDate() != null ? queryVO.getActualRefundDate() : ""); | |
1451 | + createMergedCell(sheet, workbook, 7, 9, 7, 8, 9, 9, ""); | |
1447 | 1452 | //第五行 |
1448 | 1453 | createMergedCell(sheet, workbook, 9, 0, 9, 10, 0, 1, "收款单位"); |
1449 | 1454 | createMergedCell(sheet, workbook, 9, 2, 9, 10, 2, 9, queryVO.getPayee()); | ... | ... |
src/main/java/com/order/erp/service/order/impl/OrderBaseInfoServiceImpl.java
... | ... | @@ -230,7 +230,7 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl<OrderBaseInfoMapper, O |
230 | 230 | // 填充质检信息 |
231 | 231 | fillInspectionStageInfo(resultVOList); |
232 | 232 | |
233 | - // 填充发票信息 | |
233 | + // 填充发票信息 对于填充发票信息和填充生产科对账单号,其实不需要在这里写了,而且这里只是填充了invoice号和check号,这里的代码是填充数据,达到一个进度条的效果,既然没有根据是否填充发票来填充进度条,这里就不需要写。 | |
234 | 234 | fillInvoiceNo(resultVOList); |
235 | 235 | //第四版 start |
236 | 236 | /* //需要填充生产科对账单号信息 |
... | ... | @@ -886,9 +886,6 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl<OrderBaseInfoMapper, O |
886 | 886 | } |
887 | 887 | |
888 | 888 | Set<Long> orderIds = orderInfoResultVOList.stream().map(OrderInfoResultVO::getId).collect(Collectors.toSet()); |
889 | - /* List<InvoiceBillMappingDO> invoiceBillMappingDOS = invoiceBillMappingService.list(new LambdaQueryWrapper<InvoiceBillMappingDO>() | |
890 | - .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN) | |
891 | - .in(InvoiceBillMappingDO::getOrderId, orderIds));*/ | |
892 | 889 | List<InvoiceBillOrderDO> invoiceBillOrderDOList = invoiceBillOrderService.list(new LambdaQueryWrapper<InvoiceBillOrderDO>().eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN) |
893 | 890 | .in(InvoiceBillOrderDO::getOrderId, orderIds)); |
894 | 891 | |
... | ... | @@ -988,7 +985,7 @@ end |
988 | 985 | if (CollectionUtils.isEmpty(orderInfoResultVOList)) { |
989 | 986 | return; |
990 | 987 | } |
991 | - | |
988 | + //这里是判断基本,跟单,质检,项目报告书是否每一个栏都填写了。 | |
992 | 989 | orderInfoResultVOList.forEach(x -> { |
993 | 990 | int i = 0; |
994 | 991 | if (isFillOrderBaseInfo(x)) { |
... | ... | @@ -1545,6 +1542,8 @@ end |
1545 | 1542 | OrderBaseInfoDO baseInfoDO = new OrderBaseInfoDO(); |
1546 | 1543 | BeanUtils.copyProperties(baseInfoVO, baseInfoDO); |
1547 | 1544 | baseInfoDO.setOrderStatus(OrderStatusEnum.CREATE_FINISH.getStatus()); |
1545 | + baseInfoDO.setCheckStatus(FinanceEnum.NOT_CREATED.getStatus()); | |
1546 | + baseInfoDO.setInvoiceStatus(FinanceEnum.NOT_CREATED.getStatus()); | |
1548 | 1547 | save(baseInfoDO); |
1549 | 1548 | |
1550 | 1549 | OrderOpinionLogDO orderOpinionLogDO = buildOrderOpinionLogDo(baseInfoDO.getId(), |
... | ... | @@ -1747,15 +1746,29 @@ end |
1747 | 1746 | String extra=updateVO.getBaseInfo().getProductionComment().substring(productionComment.length()); |
1748 | 1747 | //当新填写的产品意见是以句号开始,就不换行。 |
1749 | 1748 | if(extra.substring(0,2).contains("。")){ |
1750 | - sendProductionCommentEmail(orderBaseInfoDo,updateVO.getBaseInfo().getProductionComment()); | |
1749 | + //去除逗号,传入方法里面作为更新的信息。 | |
1750 | + String prefix = extra.substring(0, 2).replace("。", ""); | |
1751 | + String extraString = prefix + extra.substring(2); | |
1752 | + sendProductionCommentEmail(orderBaseInfoDo,updateVO.getBaseInfo().getProductionComment(),extraString); | |
1751 | 1753 | }else{ |
1752 | 1754 | //其他情况就需要换行 |
1753 | 1755 | stringBuilder.append("\n").append(date + ": " + newProductionComment[newProductionComment.length - 1].trim()); |
1754 | 1756 | updateVO.getBaseInfo().setProductionComment(stringBuilder.toString()); |
1755 | - sendProductionCommentEmail(orderBaseInfoDo, stringBuilder.toString()); | |
1757 | + sendProductionCommentEmail(orderBaseInfoDo, stringBuilder.toString(), newProductionComment[newProductionComment.length - 1].trim()); | |
1756 | 1758 | } |
1757 | 1759 | }else{ |
1758 | - sendProductionCommentEmail(orderBaseInfoDo,updateVO.getBaseInfo().getProductionComment()); | |
1760 | + //一定是输入信息比上一次少,不为通过或者不通过。 | |
1761 | + if(orderBaseInfoDo.getProductionComment().length() > updateVO.getBaseInfo().getProductionComment().length() ){ | |
1762 | + sendProductionCommentEmail(orderBaseInfoDo,updateVO.getBaseInfo().getProductionComment(),"1"); | |
1763 | + }else{ | |
1764 | + //这里一定是通过或者未通过。截取通过后面的字符。 | |
1765 | + int index = updateVO.getBaseInfo().getProductionComment().lastIndexOf("通过"); | |
1766 | + String lastString = updateVO.getBaseInfo().getProductionComment().substring(index + 2); | |
1767 | + //获取新输入的信息,并且对信息进行去除多于符号。 | |
1768 | + String trimmedInput = lastString.replaceFirst("^[\\s,,。.;]*", ""); | |
1769 | + sendProductionCommentEmail(orderBaseInfoDo,updateVO.getBaseInfo().getProductionComment(),trimmedInput); | |
1770 | + } | |
1771 | + | |
1759 | 1772 | } |
1760 | 1773 | } |
1761 | 1774 | buildUpdateVO(updateVO.getBaseInfo(), orderBaseInfoDo); |
... | ... | @@ -2081,7 +2094,7 @@ end |
2081 | 2094 | //这个方法的作用就是:她们反应对于内部编号相同的订单,就不需要发送四个测试结果的产品意见信息,不然创建一个订单选择测试结果后就发送四个测试结果,太麻烦了,所以这里根据项目号和测试结果进行区分。 |
2082 | 2095 | public void setEmailSendUtilsRedis(OrderBaseInfoDO orderBaseInfoDo,String resultText,String productionComment){ |
2083 | 2096 | if(!redisUtils.hasKey(orderBaseInfoDo.getInnerNo()+Constant.CROSS_BAR_CHARACTER+resultText)){ |
2084 | - sendProductionCommentEmail(orderBaseInfoDo,productionComment); | |
2097 | + sendProductionCommentEmail(orderBaseInfoDo,productionComment,resultText); | |
2085 | 2098 | redisUtils.set(orderBaseInfoDo.getInnerNo()+Constant.CROSS_BAR_CHARACTER+resultText, "1", 90, TimeUnit.DAYS); |
2086 | 2099 | } |
2087 | 2100 | } |
... | ... | @@ -2626,7 +2639,7 @@ end |
2626 | 2639 | } |
2627 | 2640 | } |
2628 | 2641 | |
2629 | - private void sendProductionCommentEmail(OrderBaseInfoDO orderBaseInfoDo, String productionComment) { | |
2642 | + private void sendProductionCommentEmail(OrderBaseInfoDO orderBaseInfoDo, String productionComment,String lastString) { | |
2630 | 2643 | List<AdminUserDO> adminList = adminUserService.list(new LambdaQueryWrapper<AdminUserDO>() |
2631 | 2644 | .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN) |
2632 | 2645 | .in(AdminUserDO::getUserName, Arrays.asList(orderBaseInfoDo.getBusinessPerson(), orderBaseInfoDo.getCreateBy(), orderBaseInfoDo.getProductionDepartment()))); |
... | ... | @@ -2655,7 +2668,12 @@ end |
2655 | 2668 | orderEventJobVO.getBaseInfo().setProductionComment(productionComment); |
2656 | 2669 | orderEventJobVO.getBaseInfo().setProductionDepartmentConsignTime(orderBaseInfoDo.getProductionDepartmentConsignTime().substring(0, 10)); |
2657 | 2670 | //目前是选择的是跟单员邮箱和业务员邮箱。 |
2658 | - emailSendUtils.sendEmail(EmailTemplateEnum.PRODUCE_IDEA, emailList, orderEventJobVO); | |
2671 | + if(!"1".equals(lastString)){ | |
2672 | + emailSendUtils.sendEmail(EmailTemplateEnum.PRODUCE_IDEA, emailList, orderEventJobVO,lastString); | |
2673 | + }else{ | |
2674 | + emailSendUtils.sendEmail(EmailTemplateEnum.PRODUCE_IDEA, emailList, orderEventJobVO,"无更新信息!"); | |
2675 | + } | |
2676 | + | |
2659 | 2677 | } |
2660 | 2678 | } |
2661 | 2679 | } | ... | ... |
src/main/java/com/order/erp/service/order/impl/ProducePaymentCheckBillOrderServiceImpl.java
... | ... | @@ -201,6 +201,7 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl<Produce |
201 | 201 | queryVO.getQueryVO().setProductionDepartmentConsignEndTime(queryVO.getQueryVO().getProductionDepartmentConsignEndTime().substring(0,10)+" 23:59:59"); |
202 | 202 | } |
203 | 203 | Set<Long> existOrderIdSet=new HashSet<>(); |
204 | + Set<Long> filterDoubleOrderIds=new HashSet<>(); | |
204 | 205 | //查询数据 |
205 | 206 | List<InvoiceIdAndCheckIdResultVO> idResultVOS = invoiceBillOrderMapper.byQuerygetInvoiceIdAndCheckId(queryVO.getQueryVO()); |
206 | 207 | List<Long> checkIds = idResultVOS.stream().map(x -> x.getCheckId()).filter(Objects::nonNull).collect(Collectors.toList()); |
... | ... | @@ -211,7 +212,8 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl<Produce |
211 | 212 | List<Long> existOrderIds = checkBillOrderDOS.stream().map(x -> x.getOrderId()).collect(Collectors.toList()); |
212 | 213 | existOrderIdSet.addAll(existOrderIds); |
213 | 214 | List<Long> orderIdList = idResultVOS.stream().map(x -> x.getOrderId()).collect(Collectors.toList()); |
214 | - notExistOrderIds = orderIdList.stream() | |
215 | + filterDoubleOrderIds.addAll(orderIdList); | |
216 | + notExistOrderIds = filterDoubleOrderIds.stream() | |
215 | 217 | .filter(orderId -> !existOrderIdSet.contains(orderId)) |
216 | 218 | .collect(Collectors.toList()); |
217 | 219 | }else{ |
... | ... | @@ -904,7 +906,7 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl<Produce |
904 | 906 | throw new BusinessException("应付款单据已审核通过,无法编辑"); |
905 | 907 | } |
906 | 908 | //todo 已完成。 |
907 | - checkCommitApply(deductInfoVO.getId()); | |
909 | +// checkCommitApply(deductInfoVO.getId()); | |
908 | 910 | checkApply(new ArrayList<>(Arrays.asList(deductInfoVO.getId()))); |
909 | 911 | //需要判断一下是否为空?不然知己以逗号分隔会报错。 |
910 | 912 | if(StringUtils.isNotBlank(checkBillOrderDO.getDeductUrl())){ |
... | ... | @@ -951,7 +953,7 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl<Produce |
951 | 953 | throw new BusinessException("已完成收款,无法更新!"); |
952 | 954 | } |
953 | 955 | //todo 已完成。 |
954 | - checkCommitApply(amountInfoVO.getId()); | |
956 | +// checkCommitApply(amountInfoVO.getId()); | |
955 | 957 | checkApply(new ArrayList<>(Arrays.asList(amountInfoVO.getId()))); |
956 | 958 | |
957 | 959 | checkBillOrderDO.setActualPayedAmount1(amountInfoVO.getActualPayedAmount1() != null ? amountInfoVO.getActualPayedAmount1().setScale(2, BigDecimal.ROUND_HALF_UP) : BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_HALF_UP)); |
... | ... | @@ -1212,6 +1214,7 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl<Produce |
1212 | 1214 | List<OrderBaseInfoDO> orderBaseInfoDOS = orderBaseInfoDOList.stream().map(order -> { |
1213 | 1215 | //这里要删除对应invoiceNo号,但是为了删除后产生空指针异常,所以定义为"N/N"; |
1214 | 1216 | order.setCheckNo("N/N"); |
1217 | + order.setCheckStatus(FinanceEnum.NOT_CREATED.getStatus()); | |
1215 | 1218 | return order; |
1216 | 1219 | }).collect(Collectors.toList()); |
1217 | 1220 | transactionHelper.run(() -> { |
... | ... | @@ -1346,17 +1349,18 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl<Produce |
1346 | 1349 | //第二行 |
1347 | 1350 | Row row2 = sheet.createRow(3); |
1348 | 1351 | Cell cell2 = row2.createCell(0); |
1349 | - cell2.setCellValue("提交人:"+queryVO.getFinancePerson()); | |
1352 | + cell2.setCellValue("提交人:"+(StringUtils.isNotBlank(queryVO.getTrackerUser()) ? queryVO.getTrackerUser() : "")); | |
1350 | 1353 | sheet.addMergedRegion(new CellRangeAddress(3, 4, 0, 1)); |
1351 | 1354 | Cell cell3 = row2.createCell(2); |
1352 | 1355 | cell3.setCellValue(""); |
1353 | 1356 | sheet.addMergedRegion(new CellRangeAddress(3, 4, 2, 7)); |
1354 | 1357 | Cell cell4 = row2.createCell(8); |
1355 | - if(StringUtils.isNotBlank(queryVO.getActualPayedDate())){ | |
1358 | + /* if(StringUtils.isNotBlank(queryVO.getActualPayedDate())){ | |
1356 | 1359 | cell4.setCellValue("日期:"+queryVO.getActualPayedDate()); |
1357 | 1360 | }else{ |
1358 | 1361 | cell4.setCellValue("日期:"); |
1359 | - } | |
1362 | + }*/ | |
1363 | + cell4.setCellValue("日期:"+DateUtils.getYearandMountandDay()); | |
1360 | 1364 | sheet.addMergedRegion(new CellRangeAddress(3, 4, 8, 9)); |
1361 | 1365 | //第三行 |
1362 | 1366 | createMergedCell(sheet, workbook, 5, 0, 5, 6, 0, 1, "生产科对账单号"); |
... | ... | @@ -1373,7 +1377,7 @@ public class ProducePaymentCheckBillOrderServiceImpl extends ServiceImpl<Produce |
1373 | 1377 | createMergedCell(sheet, workbook, 7, 5, 7, 8, 5, 6, queryVO.getTotalActualPayedAmount()!=null? "¥"+queryVO.getTotalActualPayedAmount().setScale(2, BigDecimal.ROUND_HALF_UP):""); |
1374 | 1378 | createMergedCell(sheet, workbook, 7, 7, 7, 8, 7, 7, queryVO.getUnPayedAmount()!=null? "¥"+queryVO.getUnPayedAmount().setScale(2, BigDecimal.ROUND_HALF_UP):""); |
1375 | 1379 | createMergedCell(sheet, workbook, 7, 8, 7, 8, 8, 8, queryVO.getPayedDate()!=null?queryVO.getPayedDate():""); |
1376 | - createMergedCell(sheet, workbook, 7, 9, 7, 8, 9, 9, queryVO.getActualPayedDate()!=null?queryVO.getActualPayedDate():""); | |
1380 | + createMergedCell(sheet, workbook, 7, 9, 7, 8, 9, 9, ""); | |
1377 | 1381 | //第五行 |
1378 | 1382 | createMergedCell(sheet, workbook, 9, 0, 9, 10, 0, 1, "部门经理审核"); |
1379 | 1383 | createMergedCell(sheet, workbook, 9, 2, 9, 10, 2, 4, "财务审核"); | ... | ... |
src/main/resources/application-pre-prod.yml
... | ... | @@ -57,9 +57,9 @@ spring: |
57 | 57 | testWhileIdle: true |
58 | 58 | testOnBorrow: true |
59 | 59 | testOnReturn: true |
60 | - password: Erp@test123456 | |
60 | + password: eJ8(bD6]wN6=gI5= | |
61 | 61 | time-between-eviction-runs-millis: 1000 |
62 | - url: jdbc:mysql://47.104.8.35:3307/order-erp-pre-prod?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=false&autoReconnect=true&failOverReadOnly=false&maxReconnects=10&allowMultiQueries=true&useAffectedRows=true&autoReconnectForPools=true | |
62 | + url: jdbc:mysql://47.104.8.35:3307/order-erp-test-real?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=false&autoReconnect=true&failOverReadOnly=false&maxReconnects=10&allowMultiQueries=true&useAffectedRows=true&autoReconnectForPools=true | |
63 | 63 | username: root |
64 | 64 | redis: |
65 | 65 | database: 10 | ... | ... |