Commit d939bd030ca96b11119510e5c71b3a5c7a1980c7

Authored by chenhang4442024
1 parent 9d5da66f

feat:1.更新邮件提示,根据不同的客户编码重新设置邮件提示。

2.产品信息添加最新信息展示
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&lt;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&lt;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&lt;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&lt;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&lt;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&lt;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&lt;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&lt;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&lt;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&lt;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&lt;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&lt;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&lt;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&lt;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
... ...
src/main/resources/application.yml
1 1 server:
2   - port: 18000
  2 + port: 18001
3 3  
4 4 spring:
5 5 profiles:
... ...