Commit 38f027ea6d7de750b9ef83535bfb67a38658b24f
Merge branch 'dev' into test
Showing
44 changed files
with
1011 additions
and
179 deletions
fw-dalaran-common/pom.xml
... | ... | @@ -48,6 +48,10 @@ |
48 | 48 | <groupId>net.coobird</groupId> |
49 | 49 | <artifactId>thumbnailator</artifactId> |
50 | 50 | </dependency> |
51 | + <dependency> | |
52 | + <groupId>org.springframework.boot</groupId> | |
53 | + <artifactId>spring-boot</artifactId> | |
54 | + </dependency> | |
51 | 55 | </dependencies> |
52 | 56 | |
53 | 57 | </project> | ... | ... |
fw-dalaran-common/src/main/java/cn/fw/dalaran/common/ConfigProperties.java
0 → 100644
1 | +package cn.fw.dalaran.common; | |
2 | + | |
3 | +import lombok.Data; | |
4 | +import org.springframework.boot.context.properties.ConfigurationProperties; | |
5 | + | |
6 | +/** | |
7 | + * @author wmy3969 | |
8 | + * @version 1.0 | |
9 | + * @date 2022/12/29 9:43 | |
10 | + * @Description 配置文件关联 | |
11 | + */ | |
12 | +@Data | |
13 | +@ConfigurationProperties(prefix = "url") | |
14 | +public class ConfigProperties { | |
15 | + /** | |
16 | + * 图片文件 | |
17 | + */ | |
18 | + private String show; | |
19 | + /** | |
20 | + * 删除map缓存 | |
21 | + */ | |
22 | + private String delMapCache; | |
23 | + /** | |
24 | + * 重新计算综合得分 | |
25 | + */ | |
26 | + private String reCalcScore; | |
27 | +} | ... | ... |
fw-dalaran-common/src/main/java/cn/fw/dalaran/common/constants/DalaranConstants.java renamed to fw-dalaran-common/src/main/java/cn/fw/dalaran/common/constants/Constants.java
... | ... | @@ -6,7 +6,7 @@ package cn.fw.dalaran.common.constants; |
6 | 6 | * @date 2022/4/13 16:40 |
7 | 7 | * @Description Dalaran系统常量 |
8 | 8 | */ |
9 | -public interface DalaranConstants { | |
9 | +public interface Constants { | |
10 | 10 | /** |
11 | 11 | * 系统名 |
12 | 12 | */ |
... | ... | @@ -30,9 +30,19 @@ public interface DalaranConstants { |
30 | 30 | /** |
31 | 31 | * 账号配置角色码 |
32 | 32 | */ |
33 | - String ZHSZ_ROLE_CODE = "ZMT-ZHSZ"; | |
33 | + String ZHSZ_ROLE_CODE = "MKT-HDCZ"; | |
34 | 34 | /** |
35 | 35 | * 直播审计角色码 |
36 | 36 | */ |
37 | 37 | String ZBSJ_ROLE_CODE = "ZMT-ZBSJ"; |
38 | + | |
39 | + /** | |
40 | + * 薪酬绩效相关常量 | |
41 | + */ | |
42 | + interface Performance { | |
43 | + /** | |
44 | + * 综合得分目标达成率 | |
45 | + */ | |
46 | + String SCORE_RATE = "6574EA0766114615"; | |
47 | + } | |
38 | 48 | } | ... | ... |
fw-dalaran-common/src/main/java/cn/fw/dalaran/common/utils/DateUtil.java
1 | 1 | package cn.fw.dalaran.common.utils; |
2 | 2 | |
3 | +import cn.fw.common.exception.BusinessException; | |
4 | + | |
3 | 5 | import java.sql.Timestamp; |
4 | 6 | import java.text.ParseException; |
5 | 7 | import java.text.SimpleDateFormat; |
6 | 8 | import java.time.*; |
9 | +import java.time.format.DateTimeFormatter; | |
7 | 10 | import java.time.temporal.TemporalAdjusters; |
8 | -import java.util.Calendar; | |
9 | -import java.util.Date; | |
10 | -import java.util.Objects; | |
11 | +import java.util.*; | |
11 | 12 | |
12 | 13 | /** |
13 | 14 | * 日期处理工具 |
... | ... | @@ -17,6 +18,9 @@ import java.util.Objects; |
17 | 18 | */ |
18 | 19 | public final class DateUtil { |
19 | 20 | |
21 | + public static final String START = "start"; | |
22 | + public static final String END = "end"; | |
23 | + | |
20 | 24 | static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); |
21 | 25 | |
22 | 26 | /** |
... | ... | @@ -26,7 +30,6 @@ public final class DateUtil { |
26 | 30 | throw new UnsupportedOperationException(); |
27 | 31 | } |
28 | 32 | |
29 | - | |
30 | 33 | public static Date parse(String date) { |
31 | 34 | try { |
32 | 35 | return sdf.parse(date); |
... | ... | @@ -56,46 +59,6 @@ public final class DateUtil { |
56 | 59 | return localDateTime2Date(date2LocalDate(date).plusDays(1).atStartOfDay()); |
57 | 60 | } |
58 | 61 | |
59 | - /** | |
60 | - * 处理日期,保留年月日 | |
61 | - */ | |
62 | - public static LocalDate date2LocalDate(final Date date) { | |
63 | - if (date == null) { | |
64 | - return null; | |
65 | - } | |
66 | - return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).toLocalDate(); | |
67 | - } | |
68 | - | |
69 | - public static LocalTime date2LocalTime(final Date date) { | |
70 | - if (date == null) { | |
71 | - return null; | |
72 | - } | |
73 | - return LocalTime.of(date.getHours(), date.getMinutes(), date.getSeconds()); | |
74 | - } | |
75 | - | |
76 | - public static LocalDateTime date2LocalDateTime(final Date date) { | |
77 | - Instant instant = date.toInstant(); | |
78 | - ZoneId zoneId = ZoneId.systemDefault(); | |
79 | - return instant.atZone(zoneId).toLocalDateTime(); | |
80 | - } | |
81 | - | |
82 | - /** | |
83 | - * convert LocalDateTime to Date | |
84 | - */ | |
85 | - public static Date localDateTime2Date(final LocalDateTime dateTime) { | |
86 | - return Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant()); | |
87 | - } | |
88 | - | |
89 | - /** | |
90 | - * convert LocalDate to Date | |
91 | - */ | |
92 | - public static Date localDate2Date(final LocalDate localDate) { | |
93 | - if (localDate == null) { | |
94 | - return null; | |
95 | - } | |
96 | - return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); | |
97 | - } | |
98 | - | |
99 | 62 | public static Date getBeginInTime(Date inTime) { |
100 | 63 | if (inTime == null) { |
101 | 64 | return null; |
... | ... | @@ -561,6 +524,366 @@ public final class DateUtil { |
561 | 524 | return a > 18 && a <= 23; |
562 | 525 | } |
563 | 526 | |
527 | + | |
528 | + /** | |
529 | + * 获取date的天的时间范围 | |
530 | + * date: 2022-8-18 11:19:32 | |
531 | + * return: 2022-8-18 0:00:00 ——> 2022-8-18 23:59:59 | |
532 | + */ | |
533 | + public static Map<String, Date> getDayRange(Date date) { | |
534 | + Map<String, Date> dateMap = new HashMap<>(); | |
535 | + dateMap.put(START, dayBegin(date)); | |
536 | + dateMap.put(END, dayEnd(date)); | |
537 | + return dateMap; | |
538 | + } | |
539 | + | |
540 | + /** | |
541 | + * 获取date的月份的时间范围 | |
542 | + * date: 2022-8-18 11:19:32 | |
543 | + * return: 2022-8-01 0:00:00 ——> 2022-8-31 23:59:59 | |
544 | + */ | |
545 | + public static Map<String, Date> getMonthRange(Date date) { | |
546 | + Map<String, Date> dateMap = new HashMap<>(); | |
547 | + LocalDate localDate = date2LocalDate(date); | |
548 | + dateMap.put(START, dayBegin(localDate2Date(localDate.withDayOfMonth(1)))); | |
549 | + dateMap.put(END, dayEnd(localDate2Date(localDate.with(TemporalAdjusters.lastDayOfMonth())))); | |
550 | + return dateMap; | |
551 | + } | |
552 | + | |
553 | + /** | |
554 | + * 获取date的近4个月的时间范围 | |
555 | + * date: 2022-8-18 11:19:32 | |
556 | + * return: 2022-5-01 0:00:00 ——> 2022-8-31 23:59:59 | |
557 | + */ | |
558 | + public static Map<String, Date> get4MonthRange(Date date) { | |
559 | + Map<String, Date> dateMap = new HashMap<>(); | |
560 | + LocalDate localDate = date2LocalDate(date); | |
561 | + dateMap.put(START, dayBegin(localDate2Date(localDate.withDayOfMonth(1).minusMonths(3)))); | |
562 | + dateMap.put(END, dayEnd(localDate2Date(localDate.with(TemporalAdjusters.lastDayOfMonth())))); | |
563 | + return dateMap; | |
564 | + } | |
565 | + | |
566 | + /** | |
567 | + * 获取date的近1年的时间范围 | |
568 | + * date: 2022-8-18 11:19:32 | |
569 | + * return: 2021-9-01 0:00:00 ——> 2022-8-31 23:59:59 | |
570 | + */ | |
571 | + public static Map<String, Date> getOneYearRange(Date date) { | |
572 | + Map<String, Date> dateMap = new HashMap<>(); | |
573 | + LocalDate localDate = date2LocalDate(date); | |
574 | + dateMap.put(START, dayBegin(localDate2Date(localDate.withDayOfMonth(1).minusMonths(11)))); | |
575 | + dateMap.put(END, dayEnd(localDate2Date(localDate.with(TemporalAdjusters.lastDayOfMonth())))); | |
576 | + return dateMap; | |
577 | + } | |
578 | + | |
579 | + /** | |
580 | + * 获取指定时间那天的最小时间 | |
581 | + * date: 2022-8-18 11:19:32 | |
582 | + * return: 2022-8-18 0:00:00 | |
583 | + */ | |
584 | + public static Date dayBegin(Date date) { | |
585 | + return localDateTime2Date(LocalDateTime | |
586 | + .of(date2LocalDate(Objects.requireNonNull(date)), LocalTime.MIN) | |
587 | + ); | |
588 | + } | |
589 | + | |
590 | + /** | |
591 | + * 获取指定时间那天的最大时间 | |
592 | + * date: 2022-8-18 11:19:32 | |
593 | + * return: 2022-8-18 23:59:59 | |
594 | + */ | |
595 | + public static Date dayEnd(Date date) { | |
596 | + return localDateTime2Date(LocalDateTime | |
597 | + .of(date2LocalDate(Objects.requireNonNull(date)), LocalTime.MAX) | |
598 | + ); | |
599 | + } | |
600 | + | |
601 | + /** | |
602 | + * 获取指定时间那月的最小时间 | |
603 | + * date: 2022-8-18 11:19:32 | |
604 | + * return: 2022-8-01 0:00:00 | |
605 | + */ | |
606 | + public static Date monthBegin(Date date) { | |
607 | + return localDateTime2Date(LocalDateTime | |
608 | + .of(date2LocalDate(Objects.requireNonNull(date)).withDayOfMonth(1), LocalTime.MIN) | |
609 | + ); | |
610 | + } | |
611 | + | |
612 | + /** | |
613 | + * 获取指定时间那月的最大时间 | |
614 | + * date: 2022-8-18 11:19:32 | |
615 | + * return: 2022-8-31 23:59:59 | |
616 | + */ | |
617 | + public static Date monthEnd(Date date) { | |
618 | + return localDateTime2Date(LocalDateTime | |
619 | + .of(date2LocalDate(Objects.requireNonNull(date)).with(TemporalAdjusters.lastDayOfMonth()), LocalTime.MAX) | |
620 | + ); | |
621 | + } | |
622 | + | |
623 | + /** | |
624 | + * LocalDate转Date | |
625 | + */ | |
626 | + public static Date localDate2Date(LocalDate localDate) { | |
627 | + return Date.from(Objects.requireNonNull(localDate) | |
628 | + .atStartOfDay() | |
629 | + .atZone(ZoneId.systemDefault()) | |
630 | + .toInstant() | |
631 | + ); | |
632 | + } | |
633 | + | |
634 | + /** | |
635 | + * LocalDateTime转Date | |
636 | + */ | |
637 | + public static Date localDateTime2Date(LocalDateTime localDateTime) { | |
638 | + return Date.from(Objects.requireNonNull(localDateTime) | |
639 | + .atZone(ZoneId.systemDefault()) | |
640 | + .toInstant() | |
641 | + ); | |
642 | + } | |
643 | + | |
644 | + /** | |
645 | + * Date转LocalDateTime | |
646 | + */ | |
647 | + public static LocalDateTime date2LocalDateTime(Date date) { | |
648 | + return Objects.requireNonNull(date) | |
649 | + .toInstant() | |
650 | + .atZone(ZoneId.systemDefault()) | |
651 | + .toLocalDateTime() | |
652 | + ; | |
653 | + } | |
654 | + | |
655 | + /** | |
656 | + * Date转LocalTime | |
657 | + */ | |
658 | + public static LocalTime date2LocalTime(Date date) { | |
659 | + return Objects.requireNonNull(date) | |
660 | + .toInstant() | |
661 | + .atZone(ZoneId.systemDefault()) | |
662 | + .toLocalTime() | |
663 | + ; | |
664 | + } | |
665 | + | |
666 | + /** | |
667 | + * Date转LocalDate | |
668 | + */ | |
669 | + public static LocalDate date2LocalDate(Date date) { | |
670 | + return Objects.requireNonNull(date) | |
671 | + .toInstant() | |
672 | + .atZone(ZoneId.systemDefault()) | |
673 | + .toLocalDate() | |
674 | + ; | |
675 | + } | |
676 | + | |
677 | + /** | |
678 | + * 时间戳转LocalDate | |
679 | + */ | |
680 | + public static LocalDate timestamp2LocalDate(Long timestamp) { | |
681 | + return Instant. | |
682 | + ofEpochMilli(Objects.requireNonNull(timestamp)) | |
683 | + .atZone(ZoneId.systemDefault()) | |
684 | + .toLocalDate() | |
685 | + ; | |
686 | + } | |
687 | + | |
688 | + /** | |
689 | + * 时间戳转LocalDateTime | |
690 | + */ | |
691 | + public static LocalDateTime timestamp2LocalDateTime(Long timestamp) { | |
692 | + return Instant. | |
693 | + ofEpochMilli(Objects.requireNonNull(timestamp)) | |
694 | + .atZone(ZoneId.systemDefault()) | |
695 | + .toLocalDateTime() | |
696 | + ; | |
697 | + } | |
698 | + | |
699 | + /** | |
700 | + * LocalDate转时间戳 | |
701 | + */ | |
702 | + public static Long localDate2Timestamp(LocalDate localDate) { | |
703 | + return Objects.requireNonNull(localDate) | |
704 | + .atStartOfDay(ZoneId.systemDefault()) | |
705 | + .toInstant() | |
706 | + .toEpochMilli() | |
707 | + ; | |
708 | + } | |
709 | + | |
710 | + /** | |
711 | + * LocalDateTime转时间戳 | |
712 | + */ | |
713 | + public static Long localDateTime2Timestamp(LocalDateTime localDateTime) { | |
714 | + return Objects.requireNonNull(localDateTime) | |
715 | + .toInstant(ZoneOffset.ofHours(8)) | |
716 | + .toEpochMilli() | |
717 | + ; | |
718 | + } | |
719 | + | |
720 | + /** | |
721 | + * 按照pattern指定的格式格式化LocalDateTime对象 | |
722 | + */ | |
723 | + public static String formatLocalDateTime(LocalDateTime localDateTime, String pattern) { | |
724 | + DateTimeFormatter dtf = DateTimeFormatter.ofPattern(Objects.requireNonNull(pattern)); | |
725 | + return Objects.requireNonNull(localDateTime).format(dtf); | |
726 | + } | |
727 | + | |
728 | + /** | |
729 | + * 两个时间是否在同一天 | |
730 | + */ | |
731 | + public static boolean sameDay(Date day1, Date day2) { | |
732 | + return Objects.equals(date2LocalDate(Objects.requireNonNull(day1)), date2LocalDate(Objects.requireNonNull(day2))); | |
733 | + } | |
734 | + | |
735 | + /** | |
736 | + * 两个时间是否在同一月 | |
737 | + */ | |
738 | + public static boolean sameMonth(Date day1, Date day2) { | |
739 | + LocalDate date1 = date2LocalDate(Objects.requireNonNull(day1)); | |
740 | + LocalDate date2 = date2LocalDate(Objects.requireNonNull(day2)); | |
741 | + return Objects.equals(date1.getYear(), date2.getYear()) && Objects.equals(date1.getMonthValue(), date2.getMonthValue()); | |
742 | + } | |
743 | + | |
744 | + /** | |
745 | + * 两个时间是否在同一年 | |
746 | + */ | |
747 | + public static boolean sameYear(Date day1, Date day2) { | |
748 | + LocalDate date1 = date2LocalDate(Objects.requireNonNull(day1)); | |
749 | + LocalDate date2 = date2LocalDate(Objects.requireNonNull(day2)); | |
750 | + return Objects.equals(date1.getYear(), date2.getYear()); | |
751 | + } | |
752 | + | |
753 | + /** | |
754 | + * 指定时间 + 指定秒 | |
755 | + */ | |
756 | + public static Date plusSeconds(Date date, int seconds) { | |
757 | + return localDateTime2Date(date2LocalDateTime(Objects.requireNonNull(date)).plusSeconds(Math.abs(seconds))); | |
758 | + } | |
759 | + | |
760 | + /** | |
761 | + * 指定时间 - 指定秒 | |
762 | + */ | |
763 | + public static Date minusSeconds(Date date, int seconds) { | |
764 | + return localDateTime2Date(date2LocalDateTime(Objects.requireNonNull(date)).minusSeconds(Math.abs(seconds))); | |
765 | + } | |
766 | + | |
767 | + /** | |
768 | + * 指定时间 + 指定分钟 | |
769 | + */ | |
770 | + public static Date plusMinutes(Date date, int minutes) { | |
771 | + return localDateTime2Date(date2LocalDateTime(Objects.requireNonNull(date)).plusMinutes(Math.abs(minutes))); | |
772 | + } | |
773 | + | |
774 | + /** | |
775 | + * 指定时间 - 指定秒 | |
776 | + */ | |
777 | + public static Date minusMinutes(Date date, int minutes) { | |
778 | + return localDateTime2Date(date2LocalDateTime(Objects.requireNonNull(date)).minusMinutes(Math.abs(minutes))); | |
779 | + } | |
780 | + | |
781 | + /** | |
782 | + * 指定时间 + 指定小时 | |
783 | + */ | |
784 | + public static Date plusHours(Date date, int hours) { | |
785 | + return localDateTime2Date(date2LocalDateTime(Objects.requireNonNull(date)).plusHours(Math.abs(hours))); | |
786 | + } | |
787 | + | |
788 | + /** | |
789 | + * 指定时间 - 指定小时 | |
790 | + */ | |
791 | + public static Date minusHours(Date date, int hours) { | |
792 | + return localDateTime2Date(date2LocalDateTime(Objects.requireNonNull(date)).minusHours(Math.abs(hours))); | |
793 | + } | |
794 | + | |
795 | + /** | |
796 | + * 指定时间 + 指定天 | |
797 | + */ | |
798 | + public static Date plusDays(Date date, int days) { | |
799 | + return localDateTime2Date(date2LocalDateTime(Objects.requireNonNull(date)).plusDays(Math.abs(days))); | |
800 | + } | |
801 | + | |
802 | + /** | |
803 | + * 指定时间 - 指定天 | |
804 | + */ | |
805 | + public static Date minusDays(Date date, int days) { | |
806 | + return localDateTime2Date(date2LocalDateTime(Objects.requireNonNull(date)).minusDays(Math.abs(days))); | |
807 | + } | |
808 | + | |
809 | + /** | |
810 | + * 指定时间 + 指定星期 | |
811 | + */ | |
812 | + public static Date plusWeeks(Date date, int weeks) { | |
813 | + return localDateTime2Date(date2LocalDateTime(Objects.requireNonNull(date)).plusWeeks(Math.abs(weeks))); | |
814 | + } | |
815 | + | |
816 | + /** | |
817 | + * 指定时间 - 指定星期 | |
818 | + */ | |
819 | + public static Date minusWeeks(Date date, int weeks) { | |
820 | + return localDateTime2Date(date2LocalDateTime(Objects.requireNonNull(date)).minusWeeks(Math.abs(weeks))); | |
821 | + } | |
822 | + | |
823 | + /** | |
824 | + * 指定时间 + 指定月 | |
825 | + */ | |
826 | + public static Date plusMonths(Date date, int months) { | |
827 | + return localDateTime2Date(date2LocalDateTime(Objects.requireNonNull(date)).plusMonths(Math.abs(months))); | |
828 | + } | |
829 | + | |
830 | + /** | |
831 | + * 指定时间 - 指定月 | |
832 | + */ | |
833 | + public static Date minusMonths(Date date, int months) { | |
834 | + return localDateTime2Date(date2LocalDateTime(Objects.requireNonNull(date)).minusMonths(Math.abs(months))); | |
835 | + } | |
836 | + | |
837 | + /** | |
838 | + * 指定时间 + 指定年 | |
839 | + */ | |
840 | + public static Date plusYears(Date date, int years) { | |
841 | + return localDateTime2Date(date2LocalDateTime(Objects.requireNonNull(date)).plusYears(Math.abs(years))); | |
842 | + } | |
843 | + | |
844 | + /** | |
845 | + * 指定时间 - 指定年 | |
846 | + */ | |
847 | + public static Date minusYears(Date date, int years) { | |
848 | + return localDateTime2Date(date2LocalDateTime(Objects.requireNonNull(date)).minusYears(Math.abs(years))); | |
849 | + } | |
850 | + | |
851 | + /** | |
852 | + * 校验时间有无重叠 | |
853 | + * | |
854 | + * @param startDate1 开始时间1 | |
855 | + * @param endDate1 结束时间1 | |
856 | + * @param startDate2 开始时间2 | |
857 | + * @param endDate2 结束时间2 | |
858 | + * @return 两个时间区间是否有重叠 | |
859 | + */ | |
860 | + public static boolean validDateOverlap(Date startDate1, Date endDate1, Date startDate2, Date endDate2) { | |
861 | + if (startDate1.after(endDate1) || startDate2.after(endDate2)) | |
862 | + throw new BusinessException("开始时间必须在结束时间之前"); | |
863 | + return !endDate2.before(startDate1) && !startDate2.after(endDate1) && !endDate1.before(startDate2) && !startDate1.after(endDate2); | |
864 | + } | |
865 | + | |
866 | + /** | |
867 | + * 毫秒->xx天xx小时xx分xx秒xx毫秒 | |
868 | + */ | |
869 | + public static String millisToString(Long totalMillis) { | |
870 | + totalMillis = Math.abs(totalMillis); | |
871 | + int secondMillis = 1000;// 每秒钟毫秒数 | |
872 | + int minuteMillis = secondMillis * 60;// 每分钟毫秒数 | |
873 | + int hourMillis = minuteMillis * 60;// 每小时毫秒数 | |
874 | + int dayMillis = hourMillis * 24;// 每天毫秒数 | |
875 | + long days = totalMillis / dayMillis;// 共有多少天 | |
876 | + long hours = (totalMillis - days * dayMillis) / hourMillis;// 还有多少小时 | |
877 | + long minutes = (totalMillis - days * dayMillis - hours * hourMillis) / minuteMillis;// 还有多少分钟 | |
878 | + /*long seconds = (totalMillis - days * dayMillis - hours * hourMillis - minutes * minuteMillis) / secondMillis;// 还有多少秒 | |
879 | + long millis = totalMillis - days * dayMillis - hours * hourMillis - minutes * minuteMillis - seconds * secondMillis;// 还有多少毫秒*/ | |
880 | + return (days > 0 ? days : 0) + "天" + | |
881 | + (hours > 0 ? hours : 0) + "小时" + | |
882 | + (minutes > 0 ? minutes : 0) + "分" /*+ | |
883 | + (seconds > 0 ? seconds : 0) + "秒" + | |
884 | + (millis > 0 ? millis : 0) + "毫秒"*/; | |
885 | + } | |
886 | + | |
564 | 887 | public static void main(String[] args) throws ParseException { |
565 | 888 | SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
566 | 889 | Date date = format.parse("2020-09-19 15:45:30"); | ... | ... |
fw-dalaran-dao/src/main/java/cn/fw/dalaran/dao/ActivityThemeDao.java
... | ... | @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
5 | 5 | import org.apache.ibatis.annotations.Mapper; |
6 | 6 | import org.apache.ibatis.annotations.Param; |
7 | 7 | |
8 | +import java.util.List; | |
9 | + | |
8 | 10 | /** |
9 | 11 | * @author wmy3969 |
10 | 12 | * @version 1.0 |
... | ... | @@ -19,4 +21,11 @@ public interface ActivityThemeDao extends BaseMapper<ActivityTheme> { |
19 | 21 | * @param param 修改的参数封装 |
20 | 22 | */ |
21 | 23 | boolean alertTheme(@Param("param") ActivityTheme param); |
24 | + | |
25 | + /** | |
26 | + * 获取已经逻辑删除的主题列表 | |
27 | + * | |
28 | + * @return 已经逻辑删除的主题列表 | |
29 | + */ | |
30 | + List<ActivityTheme> getHasDelActivityTheme(); | |
22 | 31 | } | ... | ... |
fw-dalaran-dao/src/main/resources/mapper/ActivityThemeDaoMapper.xml
fw-dalaran-domain/src/main/java/cn/fw/dalaran/domain/db/ConfigGroup.java
fw-dalaran-domain/src/main/java/cn/fw/dalaran/domain/db/GlobalConfig.java
fw-dalaran-domain/src/main/java/cn/fw/dalaran/domain/db/TodoHistory.java
... | ... | @@ -46,4 +46,11 @@ public class TodoHistory extends BaseAuditableTimeEntity<TodoHistory, Long> { |
46 | 46 | * 附加信息 |
47 | 47 | */ |
48 | 48 | private String extra; |
49 | + | |
50 | + /** | |
51 | + * 自定义去重条件 | |
52 | + */ | |
53 | + public String getRemoveDuplicatesCondition() { | |
54 | + return this.getUserId() + "-->" + this.getDataId(); | |
55 | + } | |
49 | 56 | } | ... | ... |
fw-dalaran-domain/src/main/java/cn/fw/dalaran/domain/enums/ConfigEnum.java
fw-dalaran-domain/src/main/java/cn/fw/dalaran/domain/vo/ConfigGroupVo.java
fw-dalaran-domain/src/main/java/cn/fw/dalaran/domain/vo/LiveCheckVo.java
... | ... | @@ -19,13 +19,13 @@ public class LiveCheckVo { |
19 | 19 | /** |
20 | 20 | * 待审核直播列表 |
21 | 21 | */ |
22 | - private List<liveSummary> liveList; | |
22 | + private List<LiveSummary> liveList; | |
23 | 23 | |
24 | 24 | /** |
25 | 25 | * 待审核直播 |
26 | 26 | */ |
27 | 27 | @Data |
28 | - public static class liveSummary { | |
28 | + public static class LiveSummary { | |
29 | 29 | /** |
30 | 30 | * 主键id |
31 | 31 | */ | ... | ... |
fw-dalaran-rpc/pom.xml
... | ... | @@ -39,6 +39,11 @@ |
39 | 39 | <groupId>cn.fw</groupId> |
40 | 40 | <artifactId>fw-attendance-sdk</artifactId> |
41 | 41 | </dependency> |
42 | + <!-- 绩效系统 --> | |
43 | + <dependency> | |
44 | + <groupId>cn.fw</groupId> | |
45 | + <artifactId>fw-morax-sdk</artifactId> | |
46 | + </dependency> | |
42 | 47 | <!-- 校验注解 --> |
43 | 48 | <dependency> |
44 | 49 | <groupId>javax.validation</groupId> | ... | ... |
fw-dalaran-rpc/src/main/java/cn/fw/dalaran/rpc/erp/ErpTaskRpc.java
1 | 1 | package cn.fw.dalaran.rpc.erp; |
2 | 2 | |
3 | 3 | import cn.fw.common.exception.BusinessException; |
4 | -import cn.fw.dalaran.common.constants.DalaranConstants; | |
4 | +import cn.fw.dalaran.common.constants.Constants; | |
5 | 5 | import cn.fw.dalaran.rpc.erp.dto.TaskSetReq; |
6 | 6 | import cn.fw.data.base.domain.common.Message; |
7 | 7 | import cn.fw.erp.sdk.api.TaskApi; |
... | ... | @@ -29,7 +29,7 @@ public class ErpTaskRpc { |
29 | 29 | try { |
30 | 30 | TaskAddReq<T> addReq = new TaskAddReq<>(); |
31 | 31 | BeanUtils.copyProperties(req, addReq); |
32 | - addReq.setSystem(DalaranConstants.APPLICATION_NAME); | |
32 | + addReq.setSystem(Constants.APPLICATION_NAME); | |
33 | 33 | final Message<Long> msg = taskApi.addTask(addReq); |
34 | 34 | log.info("调用ERP系统添加定时任务结果[{}]", JSON.toJSONString(msg)); |
35 | 35 | } catch (Exception e) { | ... | ... |
fw-dalaran-rpc/src/main/java/cn/fw/dalaran/rpc/morax/SalaryRpc.java
0 → 100644
1 | +package cn.fw.dalaran.rpc.morax; | |
2 | + | |
3 | +import cn.fw.dalaran.common.utils.PublicUtil; | |
4 | +import cn.fw.data.base.domain.common.Message; | |
5 | +import cn.fw.morax.sdk.api.IKpiReportService; | |
6 | +import cn.fw.morax.sdk.api.ISalaryReportService; | |
7 | +import cn.fw.morax.sdk.dto.CustomList; | |
8 | +import cn.fw.morax.sdk.dto.kpi.KpiGroupUserQuery; | |
9 | +import cn.fw.morax.sdk.dto.kpi.KpiGroupUserResult; | |
10 | +import cn.fw.morax.sdk.dto.kpi.UserIndicatorReq; | |
11 | +import lombok.RequiredArgsConstructor; | |
12 | +import lombok.extern.slf4j.Slf4j; | |
13 | +import org.springframework.stereotype.Component; | |
14 | + | |
15 | +import java.util.Collections; | |
16 | +import java.util.List; | |
17 | + | |
18 | + | |
19 | +/** | |
20 | + * @author wmy3969 | |
21 | + * @version 1.0 | |
22 | + * @date 2022/10/9 14:05 | |
23 | + * @Description 绩效薪酬rpc | |
24 | + */ | |
25 | +@Slf4j | |
26 | +@Component | |
27 | +@RequiredArgsConstructor | |
28 | +public class SalaryRpc { | |
29 | + | |
30 | + private final IKpiReportService kpiApi;// 绩效api | |
31 | + private final ISalaryReportService salaryApi;// 薪酬api | |
32 | + | |
33 | + /** | |
34 | + * 查询绩效组人员 | |
35 | + */ | |
36 | + public List<KpiGroupUserResult> queryGroupUsers(KpiGroupUserQuery kpiGroupUserQuery) { | |
37 | + try { | |
38 | + Message<List<KpiGroupUserResult>> groupUser = kpiApi.queryKpiGroupUser(kpiGroupUserQuery); | |
39 | + PublicUtil.assertTrue(groupUser.isSuccess(), "查询绩效组人员失败!"); | |
40 | + return groupUser.getData(); | |
41 | + } catch (Exception e) { | |
42 | + log.error("查询绩效组人员发生错误, 错误信息为: {}", e.getMessage()); | |
43 | + return Collections.emptyList(); | |
44 | + } | |
45 | + } | |
46 | + | |
47 | + /** | |
48 | + * 上报人员绩效数据 | |
49 | + */ | |
50 | + public void reportKpi(CustomList<UserIndicatorReq> userIndicatorList) { | |
51 | + try { | |
52 | + Message<Void> msg = kpiApi.indicatorReport(userIndicatorList); | |
53 | + PublicUtil.assertTrue(msg.isSuccess(), "上报人员绩效数据失败!"); | |
54 | + } catch (Exception e) { | |
55 | + log.error("上报人员绩效数据发生错误, 错误信息为: {}", e.getMessage()); | |
56 | + } | |
57 | + } | |
58 | + | |
59 | +} | ... | ... |
fw-dalaran-server/pom.xml
... | ... | @@ -26,6 +26,11 @@ |
26 | 26 | <groupId>cn.fw</groupId> |
27 | 27 | <artifactId>fw-notice-sdk</artifactId> |
28 | 28 | </dependency> |
29 | + <!-- 绩效系统 --> | |
30 | + <dependency> | |
31 | + <groupId>cn.fw</groupId> | |
32 | + <artifactId>fw-morax-sdk</artifactId> | |
33 | + </dependency> | |
29 | 34 | <dependency> |
30 | 35 | <groupId>cn.fw</groupId> |
31 | 36 | <artifactId>fw-attendance-sdk</artifactId> |
... | ... | @@ -65,6 +70,10 @@ |
65 | 70 | <artifactId>spring-boot-starter-actuator</artifactId> |
66 | 71 | </dependency> |
67 | 72 | <dependency> |
73 | + <groupId>io.micrometer</groupId> | |
74 | + <artifactId>micrometer-registry-prometheus</artifactId> | |
75 | + </dependency> | |
76 | + <dependency> | |
68 | 77 | <groupId>org.springframework.boot</groupId> |
69 | 78 | <artifactId>spring-boot-starter-undertow</artifactId> |
70 | 79 | </dependency> |
... | ... | @@ -141,11 +150,10 @@ |
141 | 150 | <version>1.0.0</version> |
142 | 151 | </dependency> |
143 | 152 | <dependency> |
144 | - <groupId>org.hibernate.validator</groupId> | |
145 | - <artifactId>hibernate-validator</artifactId> | |
146 | - <version>6.0.11.Final</version> | |
153 | + <groupId>org.springframework.boot</groupId> | |
154 | + <artifactId>spring-boot-configuration-processor</artifactId> | |
155 | + <optional>true</optional> | |
147 | 156 | </dependency> |
148 | - | |
149 | 157 | </dependencies> |
150 | 158 | |
151 | 159 | <build> |
... | ... | @@ -158,6 +166,7 @@ |
158 | 166 | <include>**/*.yml</include> |
159 | 167 | <include>**/*.properties</include> |
160 | 168 | <include>**/*.xml</include> |
169 | + <include>**/banner.txt</include> | |
161 | 170 | </includes> |
162 | 171 | </resource> |
163 | 172 | </resources> | ... | ... |
fw-dalaran-server/src/main/java/cn/fw/dalaran/server/Application.java
1 | 1 | package cn.fw.dalaran.server; |
2 | 2 | |
3 | +import cn.fw.dalaran.common.ConfigProperties; | |
3 | 4 | import cn.fw.security.auth.client.EnableAuthClient; |
4 | 5 | import org.mybatis.spring.annotation.MapperScan; |
5 | 6 | import org.springframework.boot.SpringApplication; |
6 | 7 | import org.springframework.boot.autoconfigure.SpringBootApplication; |
8 | +import org.springframework.boot.context.properties.EnableConfigurationProperties; | |
7 | 9 | import org.springframework.cache.annotation.EnableCaching; |
8 | 10 | import org.springframework.cloud.client.discovery.EnableDiscoveryClient; |
9 | 11 | import org.springframework.cloud.openfeign.EnableFeignClients; |
10 | 12 | import org.springframework.context.annotation.ComponentScan; |
11 | 13 | import org.springframework.context.annotation.Configuration; |
14 | +import org.springframework.context.annotation.EnableAspectJAutoProxy; | |
12 | 15 | import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; |
13 | 16 | import org.springframework.scheduling.annotation.EnableAsync; |
14 | 17 | import org.springframework.scheduling.annotation.EnableScheduling; |
... | ... | @@ -17,7 +20,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; |
17 | 20 | /** |
18 | 21 | * 启动类 |
19 | 22 | * |
20 | - *@author kurisu | |
23 | + * @author kurisu | |
21 | 24 | */ |
22 | 25 | @EnableAsync |
23 | 26 | @SpringBootApplication |
... | ... | @@ -31,6 +34,8 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; |
31 | 34 | @MapperScan("cn.fw.**.dao") |
32 | 35 | @ComponentScan({"cn.fw.dalaran.*"}) |
33 | 36 | @EnableFeignClients({"cn.fw.**.sdk"}) |
37 | +@EnableAspectJAutoProxy(exposeProxy = true) | |
38 | +@EnableConfigurationProperties({ConfigProperties.class}) | |
34 | 39 | public class Application { |
35 | 40 | public static void main(final String[] args) { |
36 | 41 | SpringApplication.run(Application.class, args); | ... | ... |
fw-dalaran-server/src/main/java/cn/fw/dalaran/server/controller/app/OtherController.java
... | ... | @@ -41,6 +41,7 @@ public class OtherController { |
41 | 41 | |
42 | 42 | private final OtherBizService otherBizService; |
43 | 43 | private final Common common; |
44 | + //private final TodoTask todoTask;// 定时任务 | |
44 | 45 | |
45 | 46 | /** |
46 | 47 | * 获取直播审计页面 |
... | ... | @@ -73,7 +74,7 @@ public class OtherController { |
73 | 74 | */ |
74 | 75 | @GetMapping("/getLiveCheckDetails") |
75 | 76 | @ControllerMethod("获取某条审计详情") |
76 | - public Message<LiveCheckVo.liveSummary> getLiveCheckDetails(@NotNull(message = "请必须指定数据id") Long id) { | |
77 | + public Message<LiveCheckVo.LiveSummary> getLiveCheckDetails(@NotNull(message = "请必须指定数据id") Long id) { | |
77 | 78 | return success(otherBizService.getLiveCheckDetails(id)); |
78 | 79 | } |
79 | 80 | |
... | ... | @@ -104,4 +105,16 @@ public class OtherController { |
104 | 105 | return success(result); |
105 | 106 | } |
106 | 107 | |
108 | + /** | |
109 | + * 重发直播审计待办 | |
110 | + * | |
111 | + * @param timestamp 时间戳 | |
112 | + * @return | |
113 | + */ | |
114 | + /*@GetMapping("/resendLiveCheckBacklog") | |
115 | + public Message<Void> test(@NotNull(message = "请必须指定时间戳") Long timestamp) { | |
116 | + todoTask.sendLiveCheckBacklog(timestamp); | |
117 | + return Message.success(); | |
118 | + }*/ | |
119 | + | |
107 | 120 | } | ... | ... |
fw-dalaran-server/src/main/java/cn/fw/dalaran/server/controller/web/ConfigGroupController.java
1 | 1 | package cn.fw.dalaran.server.controller.web; |
2 | 2 | |
3 | -import cn.fw.common.web.annotation.ControllerMethod; | |
4 | 3 | import cn.fw.common.web.auth.LoginAuthBean; |
5 | 4 | import cn.fw.common.web.auth.annotation.CurrentUser; |
6 | 5 | import cn.fw.dalaran.domain.vo.ConfigGroupVo; |
... | ... | @@ -42,7 +41,6 @@ public class ConfigGroupController { |
42 | 41 | * @return 操作结果 |
43 | 42 | */ |
44 | 43 | @GetMapping("/init") |
45 | - @ControllerMethod("初始化配置组") | |
46 | 44 | public Message<ConfigGroupVo> init(@CurrentUser LoginAuthBean user) { |
47 | 45 | return success(configGroupService.init(user.getUserId(), user.getGroupId())); |
48 | 46 | } |
... | ... | @@ -66,7 +64,6 @@ public class ConfigGroupController { |
66 | 64 | * @return 符合条件的配置列表 |
67 | 65 | */ |
68 | 66 | @GetMapping("/list") |
69 | - @ControllerMethod("查询配置列表") | |
70 | 67 | public Message<List<ConfigGroupVo>> list(@CurrentUser LoginAuthBean user) { |
71 | 68 | return success(configGroupService.queryList(user.getUserId(), user.getGroupId())); |
72 | 69 | } | ... | ... |
fw-dalaran-server/src/main/java/cn/fw/dalaran/server/controller/web/TestBizService.java
0 → 100644
1 | +package cn.fw.dalaran.server.controller.web; | |
2 | + | |
3 | +import cn.fw.attendance.sdk.api.AttendanceApi; | |
4 | +import cn.fw.attendance.sdk.api.StaffStatusApi; | |
5 | +import cn.fw.attendance.sdk.api.dto.UsersScheduleDetailsDto; | |
6 | +import cn.fw.attendance.sdk.api.result.UserStatusVo; | |
7 | +import cn.fw.attendance.sdk.api.result.UsersScheduleDetailsVo; | |
8 | +import cn.fw.dalaran.domain.db.Account; | |
9 | +import cn.fw.dalaran.domain.enums.PlatformEnum; | |
10 | +import cn.fw.dalaran.service.data.AccountService; | |
11 | +import cn.fw.data.base.domain.common.Message; | |
12 | +import lombok.RequiredArgsConstructor; | |
13 | +import lombok.extern.slf4j.Slf4j; | |
14 | +import org.springframework.aop.framework.AopContext; | |
15 | +import org.springframework.beans.factory.annotation.Autowired; | |
16 | +import org.springframework.stereotype.Service; | |
17 | +import org.springframework.transaction.annotation.Transactional; | |
18 | + | |
19 | +import java.util.Arrays; | |
20 | +import java.util.Date; | |
21 | +import java.util.List; | |
22 | + | |
23 | +/** | |
24 | + * @author wmy3969 | |
25 | + * @version 1.0 | |
26 | + * @date 2022/10/12 0:23 | |
27 | + * @Description | |
28 | + */ | |
29 | +@Slf4j | |
30 | +@Service | |
31 | +@RequiredArgsConstructor | |
32 | +public class TestBizService { | |
33 | + | |
34 | + /* | |
35 | + * A(不+事务注解)中调用B(+事务注解): | |
36 | + * A无事务, B无事务 | |
37 | + * | |
38 | + * A(+事务注解)中调用B(+事务注解): | |
39 | + * A有事务, B无事务 | |
40 | + * | |
41 | + * 解决方案: | |
42 | + * 1: bean中自己注入自己, 让A中调用B方法使用注入的自己去调用B方法(testBizService.methodB(), 而不是this.methodB()) | |
43 | + * 2: 配置类上声明@EnableAspectJAutoProxy(exposeProxy = true), 然后业务方法((TestBizService) AopContext.currentProxy()).methodB() | |
44 | + * AopContext.currentProxy()其实就是获取的代理对象, bean中注入的自己也是代理对象 | |
45 | + */ | |
46 | + | |
47 | + private TestBizService testBizService; | |
48 | + private final StaffStatusApi staffStatusApi; | |
49 | + private final AttendanceApi attendanceApi; | |
50 | + | |
51 | + @Autowired | |
52 | + public void inject(TestBizService testBizService) { | |
53 | + this.testBizService = testBizService; | |
54 | + } | |
55 | + | |
56 | + private final AccountService accountService; | |
57 | + | |
58 | + @Transactional(rollbackFor = Exception.class) | |
59 | + public void methodA() { | |
60 | + Message<UserStatusVo> details = staffStatusApi.getUserStatusDetails(Arrays.asList(760L, 1545L, 1486L, 1342L), 1611975222000L, 1675047222937L); | |
61 | + UsersScheduleDetailsDto dto = new UsersScheduleDetailsDto(); | |
62 | + dto.setGroupId(2L); | |
63 | + dto.setUserIds(Arrays.asList(760L, 1545L, 1486L, 1342L)); | |
64 | + dto.setStartTime(new Date(1646818372000L)); | |
65 | + dto.setEndTime(new Date(1678354372000L)); | |
66 | + Message<List<UsersScheduleDetailsVo>> scheduleDetails = attendanceApi.getUsersScheduleDetails(dto); | |
67 | + Account account = new Account(); | |
68 | + account.setAccount("methodA"); | |
69 | + account.setYn(Boolean.FALSE); | |
70 | + account.setGroupId(2L); | |
71 | + account.setType(PlatformEnum.DY); | |
72 | + account.setUserId(1545L); | |
73 | + account.setShopId(11L); | |
74 | + accountService.save(account); | |
75 | + try { | |
76 | + //this.methodB(); | |
77 | + //testBizService.methodB(); | |
78 | + //testBizService1.methodB(); | |
79 | + ((TestBizService) AopContext.currentProxy()).methodB(); | |
80 | + } catch (Exception e) { | |
81 | + e.printStackTrace(); | |
82 | + } | |
83 | + //int i = 1 / 0; | |
84 | + } | |
85 | + | |
86 | + @Transactional(rollbackFor = Exception.class/*, propagation = Propagation.REQUIRES_NEW*/) | |
87 | + public void methodB() { | |
88 | + Account account = new Account(); | |
89 | + account.setAccount("methodB"); | |
90 | + account.setYn(Boolean.FALSE); | |
91 | + account.setGroupId(2L); | |
92 | + account.setType(PlatformEnum.DY); | |
93 | + account.setUserId(1545L); | |
94 | + account.setShopId(11L); | |
95 | + accountService.save(account); | |
96 | + int i = 1 / 0; | |
97 | + } | |
98 | +} | ... | ... |
fw-dalaran-server/src/main/java/cn/fw/dalaran/server/controller/web/TestController.java
0 → 100644
1 | +package cn.fw.dalaran.server.controller.web; | |
2 | + | |
3 | +import cn.fw.security.auth.client.annotation.Authorization; | |
4 | +import cn.fw.security.auth.client.annotation.IgnoreAuth; | |
5 | +import cn.fw.security.auth.client.enums.AuthType; | |
6 | +import lombok.RequiredArgsConstructor; | |
7 | +import lombok.extern.slf4j.Slf4j; | |
8 | +import org.springframework.validation.annotation.Validated; | |
9 | +import org.springframework.web.bind.annotation.GetMapping; | |
10 | +import org.springframework.web.bind.annotation.RequestMapping; | |
11 | +import org.springframework.web.bind.annotation.RestController; | |
12 | + | |
13 | +/** | |
14 | + * @author wmy3969 | |
15 | + * @version 1.0 | |
16 | + * @date 2022/10/12 0:23 | |
17 | + * @Description | |
18 | + */ | |
19 | +@Slf4j | |
20 | +@Validated | |
21 | +@RestController | |
22 | +@RequiredArgsConstructor | |
23 | +@Authorization(AuthType.ERP) | |
24 | +@RequestMapping("/web/test") | |
25 | +@IgnoreAuth | |
26 | +public class TestController { | |
27 | + | |
28 | + private final TestBizService testBizService; | |
29 | + | |
30 | + @GetMapping("/methodA") | |
31 | + public void methodA() { | |
32 | + testBizService.methodA(); | |
33 | + } | |
34 | + | |
35 | +} | ... | ... |
fw-dalaran-server/src/main/java/cn/fw/dalaran/server/rocketMQ/InitStaffWorkStatusConsumer.java
1 | 1 | package cn.fw.dalaran.server.rocketMQ; |
2 | 2 | |
3 | -import cn.fw.dalaran.common.constants.DalaranConstants; | |
3 | +import cn.fw.dalaran.common.constants.Constants; | |
4 | 4 | import cn.fw.dalaran.domain.db.Account; |
5 | 5 | import cn.fw.dalaran.domain.db.ActivityTheme; |
6 | 6 | import cn.fw.dalaran.service.data.AccountService; |
... | ... | @@ -25,9 +25,9 @@ import java.util.stream.Collectors; |
25 | 25 | @Component |
26 | 26 | @RequiredArgsConstructor |
27 | 27 | @RocketMQMessageListener( |
28 | - topic = "task-" + DalaranConstants.APPLICATION_NAME, | |
29 | - consumerGroup = DalaranConstants.APPLICATION_NAME + "-task-" + DalaranConstants.INIT_ACCOUNT_STATUS, | |
30 | - selectorExpression = DalaranConstants.INIT_ACCOUNT_STATUS) | |
28 | + topic = "task-" + Constants.APPLICATION_NAME, | |
29 | + consumerGroup = Constants.APPLICATION_NAME + "-task-" + Constants.INIT_ACCOUNT_STATUS, | |
30 | + selectorExpression = Constants.INIT_ACCOUNT_STATUS) | |
31 | 31 | public class InitStaffWorkStatusConsumer implements RocketMQListener<Long> { |
32 | 32 | |
33 | 33 | private final AccountService accountService; |
... | ... | @@ -35,7 +35,7 @@ public class InitStaffWorkStatusConsumer implements RocketMQListener<Long> { |
35 | 35 | |
36 | 36 | @Override |
37 | 37 | public void onMessage(Long themeId) { |
38 | - log.info("收到topic为: task-{}, tag为: {}的消息, 消息内容(themeId): {}", DalaranConstants.APPLICATION_NAME, DalaranConstants.INIT_ACCOUNT_STATUS, themeId); | |
38 | + log.info("收到topic为: task-{}, tag为: {}的消息, 消息内容(themeId): {}", Constants.APPLICATION_NAME, Constants.INIT_ACCOUNT_STATUS, themeId); | |
39 | 39 | ActivityTheme theme; |
40 | 40 | if (Objects.nonNull(theme = activityThemeService.getById(themeId))) { |
41 | 41 | if (Objects.equals(theme.getAllShop(), 0)) { | ... | ... |
fw-dalaran-server/src/main/java/cn/fw/dalaran/server/rocketMQ/SalaryEventConsumer.java
0 → 100644
1 | +package cn.fw.dalaran.server.rocketMQ; | |
2 | + | |
3 | +import cn.fw.dalaran.common.constants.Constants; | |
4 | +import cn.fw.dalaran.common.utils.PublicUtil; | |
5 | +import cn.fw.dalaran.rpc.morax.SalaryRpc; | |
6 | +import cn.fw.dalaran.service.data.ActivityThemeService; | |
7 | +import cn.fw.morax.sdk.dto.CustomList; | |
8 | +import cn.fw.morax.sdk.dto.kpi.KpiGroupUserQuery; | |
9 | +import cn.fw.morax.sdk.dto.kpi.KpiGroupUserResult; | |
10 | +import cn.fw.morax.sdk.dto.kpi.KpiReportNoticeMQ; | |
11 | +import cn.fw.morax.sdk.dto.kpi.UserIndicatorReq; | |
12 | +import cn.fw.starter.redis.redis.RedisUtil; | |
13 | +import com.alibaba.fastjson.JSON; | |
14 | +import lombok.RequiredArgsConstructor; | |
15 | +import lombok.extern.slf4j.Slf4j; | |
16 | +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; | |
17 | +import org.apache.rocketmq.spring.core.RocketMQListener; | |
18 | +import org.springframework.stereotype.Component; | |
19 | + | |
20 | +import java.util.List; | |
21 | +import java.util.Objects; | |
22 | + | |
23 | +/** | |
24 | + * @author wmy3969 | |
25 | + * @version 1.0 | |
26 | + * @date 2022/10/09 10:51 | |
27 | + * @Description 薪酬绩效MQ | |
28 | + */ | |
29 | +@Slf4j | |
30 | +@Component | |
31 | +@RequiredArgsConstructor | |
32 | +@RocketMQMessageListener( | |
33 | + topic = KpiReportNoticeMQ.TOPIC, | |
34 | + consumerGroup = Constants.APPLICATION_NAME + "-" + KpiReportNoticeMQ.TOPIC) | |
35 | +public class SalaryEventConsumer implements RocketMQListener<KpiReportNoticeMQ> { | |
36 | + | |
37 | + private final RedisUtil redisUtil;// redis操作工具 | |
38 | + private final SalaryRpc salaryRpc;// 薪酬绩效rpc | |
39 | + private final ActivityThemeService activityThemeService;// 活动主题业务 | |
40 | + | |
41 | + /** | |
42 | + * 处理'上报薪酬绩效'消息 | |
43 | + * | |
44 | + * @param kpiReport | |
45 | + */ | |
46 | + @Override | |
47 | + public void onMessage(KpiReportNoticeMQ kpiReport) { | |
48 | + String indicatorCode = kpiReport.getIndicatorCode(); | |
49 | + if (Objects.equals(Constants.Performance.SCORE_RATE, indicatorCode)) | |
50 | + return; | |
51 | + log.info("收到上报薪酬绩效消息 message:{}", JSON.toJSONString(kpiReport)); | |
52 | + String redisKey = "SalaryEventConsumer:onMessage"; | |
53 | + if (redisUtil.getLock(redisKey)) { | |
54 | + try { | |
55 | + KpiGroupUserQuery param = new KpiGroupUserQuery(); | |
56 | + param.setGroupId(kpiReport.getGroupId()); | |
57 | + param.setDataDate(kpiReport.getUploadDate().getTime()); | |
58 | + param.setPostId(kpiReport.getPostId()); | |
59 | + param.setIndicatorCode(indicatorCode); | |
60 | + List<KpiGroupUserResult> users = salaryRpc.queryGroupUsers(param); | |
61 | + CustomList<UserIndicatorReq> indicates = new CustomList<>(); | |
62 | + users.forEach(item -> {// 遍历每个组 | |
63 | + /*BigDecimal targetValue = item.getTargetValue();// 目标值 | |
64 | + TargetTypeEnum targetType = item.getTargetType();// 获取目标类型*/ | |
65 | + List<KpiGroupUserResult.SimpleUserData> userIdList = item.getUserIdList(); | |
66 | + userIdList.forEach(item1 -> {// 每个组下的不同人 | |
67 | + UserIndicatorReq userIndicator = PublicUtil.copy(item1, UserIndicatorReq.class); | |
68 | + userIndicator.setIndicatorCode(indicatorCode); | |
69 | + userIndicator.setDataDate(kpiReport.getUploadDate()); | |
70 | + userIndicator.setUid(kpiReport.getUid()); | |
71 | + //userIndicator.setValue(); | |
72 | + indicates.add(userIndicator); | |
73 | + }); | |
74 | + }); | |
75 | + salaryRpc.reportKpi(indicates); | |
76 | + } catch (Exception e) { | |
77 | + log.error("处理上报薪酬绩效消息发生异常 message:{}", JSON.toJSONString(kpiReport), e); | |
78 | + } finally { | |
79 | + redisUtil.unlock(redisKey); | |
80 | + } | |
81 | + } else { | |
82 | + log.info("执行cn.fw.dalaran.server.rocketMQ.SalaryEventConsumer.onMessage()方法获取锁失败, 不消费消息"); | |
83 | + } | |
84 | + } | |
85 | + | |
86 | +} | ... | ... |
fw-dalaran-server/src/main/java/cn/fw/dalaran/server/rocketMQ/StaffLeaveEventConsumer.java
1 | 1 | package cn.fw.dalaran.server.rocketMQ; |
2 | 2 | |
3 | -import cn.fw.dalaran.common.constants.DalaranConstants; | |
3 | +import cn.fw.dalaran.common.constants.Constants; | |
4 | 4 | import cn.fw.dalaran.domain.db.Account; |
5 | 5 | import cn.fw.dalaran.service.data.AccountService; |
6 | 6 | import cn.fw.ehr.sdk.api.mq.StaffLeaveEvent; |
... | ... | @@ -24,7 +24,7 @@ import java.util.Date; |
24 | 24 | @RequiredArgsConstructor |
25 | 25 | @RocketMQMessageListener( |
26 | 26 | topic = StaffLeaveEvent.TOPIC, |
27 | - consumerGroup = DalaranConstants.APPLICATION_NAME + "-" + StaffLeaveEvent.TOPIC) | |
27 | + consumerGroup = Constants.APPLICATION_NAME + "-" + StaffLeaveEvent.TOPIC) | |
28 | 28 | public class StaffLeaveEventConsumer implements RocketMQListener<StaffLeaveEvent> { |
29 | 29 | |
30 | 30 | private final AccountService accountService; | ... | ... |
fw-dalaran-server/src/main/java/cn/fw/dalaran/server/task/OtherTask.java
... | ... | @@ -38,7 +38,8 @@ public class OtherTask { |
38 | 38 | .list() |
39 | 39 | .stream() |
40 | 40 | .filter(item -> activityThemeService.themeHaveStopCatchData(item.getEndTime(), 7)) |
41 | - .collect(Collectors.toList());// 找到需要审计的主题 | |
41 | + .collect(Collectors.toList());// 找到需要删除的主题 | |
42 | + themeList.addAll(activityThemeService.getHasDelActivityTheme());// 找到已经逻辑删除的主题 | |
42 | 43 | if (CollectionUtils.isEmpty(themeList)) |
43 | 44 | return; |
44 | 45 | String tempDir = common.getActivityThemeCoverDir(); |
... | ... | @@ -48,9 +49,6 @@ public class OtherTask { |
48 | 49 | sb.append("activityTheme"); |
49 | 50 | sb.append(File.separator); |
50 | 51 | sb.append(item.getId()); |
51 | - sb.append("「"); | |
52 | - sb.append(item.getTheme()); | |
53 | - sb.append("」"); | |
54 | 52 | String dirPath = sb.toString(); |
55 | 53 | File file = new File(dirPath); |
56 | 54 | if (file.isDirectory()) | ... | ... |
fw-dalaran-server/src/main/java/cn/fw/dalaran/server/task/TodoTask.java
1 | 1 | package cn.fw.dalaran.server.task; |
2 | 2 | |
3 | -import cn.fw.dalaran.common.constants.DalaranConstants; | |
3 | +import cn.fw.dalaran.common.constants.Constants; | |
4 | +import cn.fw.dalaran.common.utils.DateUtil; | |
4 | 5 | import cn.fw.dalaran.domain.db.Account; |
5 | 6 | import cn.fw.dalaran.domain.db.ActivityTheme; |
6 | 7 | import cn.fw.dalaran.domain.db.LivePool; |
... | ... | @@ -52,7 +53,7 @@ public class TodoTask { |
52 | 53 | List<TodoHistory> list = todoHistoryService.list(Wrappers.<TodoHistory>lambdaQuery() |
53 | 54 | .eq(TodoHistory::getSend, Boolean.FALSE) |
54 | 55 | .eq(TodoHistory::getDone, Boolean.FALSE) |
55 | - .ge(TodoHistory::getCreateTime, new Date(System.currentTimeMillis() - 7 * 24 * 3600 * 1000L))// 创建时间不超过7天的 | |
56 | + .ge(TodoHistory::getCreateTime, DateUtil.minusDays(new Date(), 7))// 创建时间不超过7天的 | |
56 | 57 | );// 找到需要推送待办的数据项 |
57 | 58 | if (CollectionUtils.isEmpty(list)) { |
58 | 59 | return; |
... | ... | @@ -60,10 +61,10 @@ public class TodoTask { |
60 | 61 | final Map<String, List<TodoHistory>> todoMap = list.stream() |
61 | 62 | .collect(Collectors.groupingBy(TodoHistory::getTodoCode));// 根据待办编码分组 |
62 | 63 | final List<TodoHistory> loginAccount = Optional |
63 | - .ofNullable(todoMap.get(DalaranConstants.ACCOUNT_INVALID)) | |
64 | + .ofNullable(todoMap.get(Constants.ACCOUNT_INVALID)) | |
64 | 65 | .orElse(new ArrayList<>()); |
65 | 66 | final List<TodoHistory> checkLive = Optional |
66 | - .ofNullable(todoMap.get(DalaranConstants.CHECK_LIVE)) | |
67 | + .ofNullable(todoMap.get(Constants.CHECK_LIVE)) | |
67 | 68 | .orElse(new ArrayList<>()); |
68 | 69 | for (TodoHistory history : loginAccount) {// 处理账号登录待办 |
69 | 70 | Account account = accountService.getById(history.getDataId()); |
... | ... | @@ -116,12 +117,12 @@ public class TodoTask { |
116 | 117 | return; |
117 | 118 | } |
118 | 119 | for (TodoHistory history : list) { |
119 | - if (Objects.equals(history.getTodoCode(), DalaranConstants.ACCOUNT_INVALID)) {// 账号失效待办 | |
120 | + /*if (Objects.equals(history.getTodoCode(), Constants.ACCOUNT_INVALID)) {// 账号失效待办 | |
120 | 121 | Account account = accountService.getById(history.getDataId()); |
121 | 122 | if (Objects.isNull(account)) { |
122 | 123 | continue; |
123 | 124 | } |
124 | - } | |
125 | + }*/ | |
125 | 126 | BackLogItemDTO dto = new BackLogItemDTO(history.getUserId(), history.getTodoCode(), |
126 | 127 | history.getDataId().toString(), new Date(), history.getShopId());// 构造待办参数 |
127 | 128 | if (todoRpcService.complete(dto)) { |
... | ... | @@ -136,15 +137,24 @@ public class TodoTask { |
136 | 137 | */ |
137 | 138 | @Scheduled(fixedRate = 15 * 60 * 1000, initialDelay = 5 * 1000) |
138 | 139 | public void sendLiveCheckBacklog() { |
140 | + this.sendLiveCheckBacklog(System.currentTimeMillis()); | |
141 | + } | |
142 | + | |
143 | + /** | |
144 | + * 发送直播审计待办 | |
145 | + * | |
146 | + * @param timeStamp 指定时间 | |
147 | + */ | |
148 | + public void sendLiveCheckBacklog(Long timeStamp) { | |
139 | 149 | final List<ActivityTheme> themeList = activityThemeService.lambdaQuery() |
140 | - .gt(ActivityTheme::getEndTime, new Date(System.currentTimeMillis() - 7 * 24 * 3600 * 1000)) | |
150 | + .gt(ActivityTheme::getEndTime, new Date(timeStamp - 7 * 24 * 3600 * 1000)) | |
141 | 151 | .list() |
142 | 152 | .stream() |
143 | 153 | .filter(item -> { |
144 | - final long timeSub = System.currentTimeMillis() - item.getEndTime().getTime(); | |
154 | + final long timeSub = timeStamp - item.getEndTime().getTime(); | |
145 | 155 | return 24 * 3600 * 1000 < timeSub && timeSub < 2 * 24 * 3600 * 1000; |
146 | 156 | }) |
147 | - .collect(Collectors.toList());// 找到需要审计的主题 | |
157 | + .collect(Collectors.toList());// 找到(理论上)需要审计的主题 | |
148 | 158 | if (CollectionUtils.isEmpty(themeList)) |
149 | 159 | return; |
150 | 160 | final List<LivePool> bestLives = livePoolService.lambdaQuery() |
... | ... | @@ -155,8 +165,9 @@ public class TodoTask { |
155 | 165 | .eq(LivePool::getValidLive, 11) |
156 | 166 | .list();// 找到主题对应的所有人的最佳直播 |
157 | 167 | final List<Long> waitCheckThemeIds = bestLives.stream() |
158 | - .map(LivePool::getThemeId).distinct() | |
159 | - .collect(Collectors.toList());// 找到需要审核的主题id集合 | |
168 | + .map(LivePool::getThemeId) | |
169 | + .distinct() | |
170 | + .collect(Collectors.toList());// 根据最佳直播分布, 找到(真正)需要审核的主题id集合 | |
160 | 171 | if (CollectionUtils.isEmpty(waitCheckThemeIds)) |
161 | 172 | return; |
162 | 173 | final List<Long> usersInShopIds = accountService.lambdaQuery() |
... | ... | @@ -170,13 +181,13 @@ public class TodoTask { |
170 | 181 | .distinct()// 祛除重复门店 |
171 | 182 | .collect(Collectors.toList());// 最佳直播的账户分布在对应的门店id集合 |
172 | 183 | final List<ActivityThemeVo> themeVos = themeList.stream() |
173 | - .filter(item -> waitCheckThemeIds.contains(item.getId())) | |
184 | + .filter(item -> waitCheckThemeIds.contains(item.getId()))// 过滤出(真正)需要审核的主题 | |
174 | 185 | .map(ActivityTheme::toVO) |
175 | 186 | .collect(Collectors.toList());// 将主题转换成vo |
176 | 187 | if (CollectionUtils.isEmpty(themeVos)) |
177 | 188 | return; |
178 | 189 | List<TodoHistory> hasSaveTodo = todoHistoryService.lambdaQuery() |
179 | - .eq(TodoHistory::getTodoCode, DalaranConstants.CHECK_LIVE) | |
190 | + .eq(TodoHistory::getTodoCode, Constants.CHECK_LIVE) | |
180 | 191 | .in(TodoHistory::getDataId, themeVos.stream() |
181 | 192 | .map(ActivityThemeVo::getId) |
182 | 193 | .collect(Collectors.toList()) |
... | ... | @@ -186,12 +197,12 @@ public class TodoTask { |
186 | 197 | .stream() |
187 | 198 | .map(item -> {// 遍历每个门店 |
188 | 199 | TodoHistory todo = new TodoHistory(); |
189 | - List<UserInfoDTO> users = userRoleRpcService.getUsers(item, DalaranConstants.ZBSJ_ROLE_CODE);// 获取门店拥有'直播审计'角色的人 | |
190 | - if (users.size() > 0) { | |
200 | + List<UserInfoDTO> users = userRoleRpcService.getUsers(item, Constants.ZBSJ_ROLE_CODE);// 获取门店拥有'直播审计'角色的人 | |
201 | + if (!users.isEmpty()) { | |
191 | 202 | todo.setSend(false); |
192 | 203 | todo.setDone(false); |
193 | 204 | todo.setTodoDone(false); |
194 | - todo.setTodoCode(DalaranConstants.CHECK_LIVE); | |
205 | + todo.setTodoCode(Constants.CHECK_LIVE); | |
195 | 206 | todo.setDataId(themeVos.stream() |
196 | 207 | .filter(item1 -> item1.getShopIds().contains(item)) |
197 | 208 | .collect(Collectors.toList()) |
... | ... | @@ -205,7 +216,7 @@ public class TodoTask { |
205 | 216 | }) |
206 | 217 | .filter(item -> Objects.nonNull(item.getTodoCode())) |
207 | 218 | .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> |
208 | - new TreeSet<>(Comparator.comparing(TodoHistory::getDataId))), ArrayList::new) | |
219 | + new TreeSet<>(Comparator.comparing(TodoHistory::getRemoveDuplicatesCondition))), ArrayList::new) | |
209 | 220 | ); |
210 | 221 | if (!Objects.equals(hasSaveTodo.size(), 0) && Objects.equals(collect.size(), hasSaveTodo.size())) |
211 | 222 | return; | ... | ... |
fw-dalaran-server/src/main/resources/application-dev.yml
... | ... | @@ -23,3 +23,8 @@ logging: |
23 | 23 | nacos: |
24 | 24 | plugin: |
25 | 25 | namespace: df959b8c-de58-4d02-b9fb-d65ca3be05f3 |
26 | + | |
27 | +url: | |
28 | + show: https://testgate.feewee.cn/file/show?fid= #文件服务器地址 | |
29 | + del-map-cache: http://testgate.feewee.cn/report2/dalaran/004/other/clearCache #清除报表系统自媒体数据缓存 | |
30 | + re-calc-score: http://testgate.feewee.cn/report2/debug/extract/data/dalaran?dateType=DAILY&type=Dalaran004D&date= #重新抽取综合得分 | ... | ... |
fw-dalaran-server/src/main/resources/application-local.yml
... | ... | @@ -12,8 +12,14 @@ nacos: |
12 | 12 | spring: |
13 | 13 | application: |
14 | 14 | name: fw-dalaran-local |
15 | + banner: | |
16 | + location: "classpath:banner.txt" | |
17 | + redis: | |
18 | + host: 172.26.154.169 | |
19 | + password: fw@test@redis | |
20 | + port: 6378 | |
15 | 21 | rocketmq: |
16 | -# name-server: 192.168.0.230:9876 | |
22 | + # name-server: 192.168.0.230:9876 | |
17 | 23 | name-server: 172.26.154.169:9876 |
18 | 24 | producer: |
19 | 25 | group: ${spring.application.name} |
... | ... | @@ -27,4 +33,7 @@ jedis: |
27 | 33 | pwd: fw@test@redis |
28 | 34 | port: 6378 |
29 | 35 | |
30 | -file-server-addr: 'http://testgate.feewee.cn/file/show?fid=' | |
36 | +url: | |
37 | + show: https://testgate.feewee.cn/file/show?fid= #文件服务器地址 | |
38 | + del-map-cache: http://testgate.feewee.cn/report2/dalaran/004/other/clearCache #清除报表系统自媒体数据缓存 | |
39 | + re-calc-score: http://testgate.feewee.cn/report2/debug/extract/data/dalaran?dateType=DAILY&type=Dalaran004D&date= #重新抽取综合得分 | ... | ... |
fw-dalaran-server/src/main/resources/application-prd.yml
... | ... | @@ -51,4 +51,7 @@ rocketmq: |
51 | 51 | task: |
52 | 52 | switch: 'on' |
53 | 53 | |
54 | -file-server-addr: 'http://gate.feewee.cn/file/show?fid=' | |
54 | +url: | |
55 | + show: https://gate.feewee.cn/file/show?fid= #文件服务器地址 | |
56 | + del-map-cache: http://gate.feewee.cn/report2/dalaran/004/other/clearCache #清除报表系统自媒体数据缓存 | |
57 | + re-calc-score: http://gate.feewee.cn/report2/debug/extract/data/dalaran?dateType=DAILY&type=Dalaran004D&date= #重新抽取综合得分 | ... | ... |
fw-dalaran-server/src/main/resources/application-test.yml
fw-dalaran-server/src/main/resources/application.yml
1 | 1 | spring: |
2 | + banner: | |
3 | + charset: US-ASCII | |
2 | 4 | application: |
3 | 5 | name: fw-dalaran |
4 | 6 | attachment: |
... | ... | @@ -112,3 +114,20 @@ logbook: |
112 | 114 | task: |
113 | 115 | switch: 'on' |
114 | 116 | todocode: 'xiOMX9KlMg' |
117 | + | |
118 | +management: | |
119 | + endpoints: | |
120 | + web: | |
121 | + exposure: | |
122 | + include: '*' | |
123 | + # 监控路径前缀 | |
124 | + base-path: /actuator | |
125 | + endpoint: | |
126 | + # 开启允许远程shutdown,通过post请求。 | |
127 | + shutdown: | |
128 | + enabled: true | |
129 | + health: | |
130 | + show-details: always | |
131 | + metrics: | |
132 | + tags: | |
133 | + application: ${spring.application.name} | ... | ... |
fw-dalaran-service/pom.xml
... | ... | @@ -114,14 +114,14 @@ |
114 | 114 | <groupId>com.baomidou</groupId> |
115 | 115 | <artifactId>mybatis-plus-boot-starter</artifactId> |
116 | 116 | </dependency> |
117 | - <dependency> | |
117 | + <!--<dependency> | |
118 | 118 | <groupId>com.baomidou</groupId> |
119 | 119 | <artifactId>mybatis-plus-generator</artifactId> |
120 | 120 | </dependency> |
121 | 121 | <dependency> |
122 | 122 | <groupId>org.apache.velocity</groupId> |
123 | 123 | <artifactId>velocity-engine-core</artifactId> |
124 | - </dependency> | |
124 | + </dependency>--> | |
125 | 125 | <!-- mybatis-plus 代码生成器 end --> |
126 | 126 | </dependencies> |
127 | 127 | ... | ... |
fw-dalaran-service/src/main/java/cn/fw/dalaran/service/biz/AccountBizService.java
... | ... | @@ -2,7 +2,7 @@ package cn.fw.dalaran.service.biz; |
2 | 2 | |
3 | 3 | import cn.fw.common.page.AppPage; |
4 | 4 | import cn.fw.common.web.annotation.DisLock; |
5 | -import cn.fw.dalaran.common.constants.DalaranConstants; | |
5 | +import cn.fw.dalaran.common.constants.Constants; | |
6 | 6 | import cn.fw.dalaran.common.exception.BusinessException; |
7 | 7 | import cn.fw.dalaran.common.utils.DateUtil; |
8 | 8 | import cn.fw.dalaran.domain.db.Account; |
... | ... | @@ -10,6 +10,7 @@ import cn.fw.dalaran.domain.db.TodoHistory; |
10 | 10 | import cn.fw.dalaran.domain.dto.AccountDTO; |
11 | 11 | import cn.fw.dalaran.domain.dto.AccountQueryDTO; |
12 | 12 | import cn.fw.dalaran.domain.dto.UpdateAccountParam; |
13 | +import cn.fw.dalaran.domain.enums.AccountStatusEnum; | |
13 | 14 | import cn.fw.dalaran.domain.enums.PlatformEnum; |
14 | 15 | import cn.fw.dalaran.domain.vo.AccountStatusVo; |
15 | 16 | import cn.fw.dalaran.domain.vo.AccountVO; |
... | ... | @@ -40,8 +41,8 @@ import static cn.fw.common.businessvalidator.Validator.BV; |
40 | 41 | @RequiredArgsConstructor |
41 | 42 | public class AccountBizService { |
42 | 43 | |
43 | - private final AccountService accountService; | |
44 | - private final TodoHistoryService todoHistoryService; | |
44 | + private final AccountService accountService;// 账号业务 | |
45 | + private final TodoHistoryService todoHistoryService;// 待办业务 | |
45 | 46 | private final UserRoleRpcService userRoleRpcService; |
46 | 47 | |
47 | 48 | /** |
... | ... | @@ -112,9 +113,9 @@ public class AccountBizService { |
112 | 113 | history.setDataId(account1.getId()); |
113 | 114 | history.setShopId(account1.getShopId()); |
114 | 115 | history.setUserId(account1.getUserId()); |
115 | - history.setTodoCode(DalaranConstants.ACCOUNT_INVALID); | |
116 | + history.setTodoCode(Constants.ACCOUNT_INVALID); | |
116 | 117 | todos.add(history); |
117 | - List<UserInfoDTO> users = userRoleRpcService.getUsers(account1.getShopId(), DalaranConstants.ZHSZ_ROLE_CODE); | |
118 | + List<UserInfoDTO> users = userRoleRpcService.getUsers(account1.getShopId(), Constants.ZHSZ_ROLE_CODE); | |
118 | 119 | if (!CollectionUtils.isEmpty(users)) { |
119 | 120 | Long managerId = users.get(0).getUserId(); |
120 | 121 | TodoHistory manageTodo = new TodoHistory(); |
... | ... | @@ -128,7 +129,7 @@ public class AccountBizService { |
128 | 129 | .map(Account::getId) |
129 | 130 | .collect(Collectors.toList());// 失败账号id |
130 | 131 | List<TodoHistory> todayHasSendList = todoHistoryService.lambdaQuery() |
131 | - .eq(TodoHistory::getTodoCode, DalaranConstants.ACCOUNT_INVALID) | |
132 | + .eq(TodoHistory::getTodoCode, Constants.ACCOUNT_INVALID) | |
132 | 133 | .in(!CollectionUtils.isEmpty(waitSendIds), TodoHistory::getDataId, waitSendIds) |
133 | 134 | .last(" and DATEDIFF(create_time, NOW()) = 0") |
134 | 135 | .list(); |
... | ... | @@ -256,8 +257,8 @@ public class AccountBizService { |
256 | 257 | .eq(Account::getAffirm, Boolean.TRUE) |
257 | 258 | .eq(Account::getValid, Boolean.TRUE) |
258 | 259 | .eq(Account::getType, platformEnum) |
259 | - .ne(Account::getAccountStatus, -1) | |
260 | - //.eq(Account::getAccountStatus, 1) | |
260 | + .ne(Account::getAccountStatus, AccountStatusEnum.HAS_LEAVE.getValue()) | |
261 | + //.eq(Account::getAccountStatus, AccountStatusEnum.IN_WORK.getValue()) | |
261 | 262 | .eq(Account::getYn, Boolean.TRUE) |
262 | 263 | ); |
263 | 264 | if (CollectionUtils.isEmpty(list)) { |
... | ... | @@ -281,6 +282,11 @@ public class AccountBizService { |
281 | 282 | */ |
282 | 283 | @Transactional(rollbackFor = Exception.class) |
283 | 284 | public boolean deleteAccount(Long id) { |
285 | + todoHistoryService.lambdaUpdate() | |
286 | + .eq(TodoHistory::getDataId, id) | |
287 | + .eq(TodoHistory::getTodoCode, Constants.ACCOUNT_INVALID) | |
288 | + .set(TodoHistory::getDone, Boolean.TRUE) | |
289 | + .update();// 账号删除完成登录待办 | |
284 | 290 | return accountService.lambdaUpdate() |
285 | 291 | .eq(Account::getId, id) |
286 | 292 | .set(Account::getYn, 0) | ... | ... |
fw-dalaran-service/src/main/java/cn/fw/dalaran/service/biz/CommonBizService.java
... | ... | @@ -781,8 +781,9 @@ public class CommonBizService { |
781 | 781 | } |
782 | 782 | |
783 | 783 | public static void main(String[] args) { |
784 | - String workTitle = "#长安汽车618闪购 #长安univ #自有引力"; | |
785 | - String setTopic = "#618厂店联动团购会#长安汽车618闪购#嗨购618团购会"; | |
784 | + System.out.println(System.getProperty("java.io.tmpdir")); | |
785 | + String workTitle = "#现车加\\\"免\\\"开新过新年"; | |
786 | + String setTopic = "#温暖回家路提现车过新年,#现车加\\免\\开新过新年,#温暖回家路春节不打烊,#开年有礼大展宏兔,#智电超能体验,#开新年夜FUN,#温暖回家路一路有你,#展厅实车带货UNI-K iDD".replace(",", ""); | |
786 | 787 | Set<String> strings1 = processTags(workTitle); |
787 | 788 | Set<String> strings2 = processTags(setTopic); |
788 | 789 | System.out.println(CollectionUtils.containsAny(strings1, strings2)); |
... | ... | @@ -841,7 +842,7 @@ public class CommonBizService { |
841 | 842 | resultSet.retainAll(configTags);// 交集 |
842 | 843 | //resultSet.removeAll(configTags);// 差集 |
843 | 844 | //resultSet.addAll(configTags);// 并集 |
844 | - containsTag = resultSet.size() > 0; | |
845 | + containsTag = !resultSet.isEmpty(); | |
845 | 846 | } else {// LCS计算话题匹配度 |
846 | 847 | for (String configTag : configTags) { |
847 | 848 | for (String tag : tags) { |
... | ... | @@ -971,17 +972,17 @@ public class CommonBizService { |
971 | 972 | public BigDecimal validCover(String theme, Long themeId, String fileId, String coverUrl, String account, String itemId, Integer type) throws Exception { |
972 | 973 | int[][] imagePixArr1;// 图片1的像素数组 |
973 | 974 | int[][] imagePixArr2;// 图片2的像素数组 |
974 | - File imageFile1 = this.findLocalCacheImageTheme(theme, themeId, fileId); | |
975 | + File imageFile1 = this.findLocalCacheImageTheme(/*theme,*/ themeId, fileId); | |
975 | 976 | imagePixArr1 = ImageUtils.readImagePixel(imageFile1); |
976 | 977 | File imageFile2; |
977 | - File localCacheImage = this.findLocalCacheImageUser(theme, themeId, account, itemId, type); | |
978 | + File localCacheImage = this.findLocalCacheImageUser(/*theme,*/ themeId, account, itemId, type); | |
978 | 979 | if (Objects.nonNull(localCacheImage)) { |
979 | 980 | imageFile2 = localCacheImage; |
980 | 981 | } else { |
981 | 982 | imageFile2 = ImageUtils.convertFileByUrl(coverUrl, itemId); |
982 | 983 | String tempDir = common.getActivityThemeCoverDir(); |
983 | 984 | File file = new File(ImageUtils.modifyResolution1(imageFile2.getPath(), |
984 | - tempDir + "activityTheme" + File.separator + themeId + "「" + theme + "」" + File.separator + account + File.separator + (Objects.equals(type, 1) ? "video" : "live"), | |
985 | + tempDir + "activityTheme" + File.separator + themeId /*+ "#" + theme*/ + File.separator + account + File.separator + (Objects.equals(type, 1) ? "video" : "live"), | |
985 | 986 | "fw_theme_cover_" + itemId, |
986 | 987 | 512, 512)); |
987 | 988 | if (imageFile2.delete()) { |
... | ... | @@ -989,7 +990,7 @@ public class CommonBizService { |
989 | 990 | } |
990 | 991 | } |
991 | 992 | imagePixArr2 = ImageUtils.readImagePixel(imageFile2); |
992 | - String msg = String.format("\n 主题: %s\n 设置封面文件id: %s\n 账户号: %s\n %s%s\n", theme, fileId, account, Objects.equals(type, 1) ? "短视频id: " : "直播间号: ", itemId); | |
993 | + String msg = String.format("\n 主题id: %s \n 主题名: %s\n 设置封面文件id: %s\n 账户号: %s\n %s%s\n", themeId, theme, fileId, account, Objects.equals(type, 1) ? "短视频id: " : "直播间号: ", itemId); | |
993 | 994 | return BigDecimal.valueOf(ImageUtils.calcSimilarity(ImageUtils.getFingerprint(imagePixArr1), ImageUtils.getFingerprint(imagePixArr2), msg)); |
994 | 995 | } |
995 | 996 | |
... | ... | @@ -1002,9 +1003,9 @@ public class CommonBizService { |
1002 | 1003 | * @param itemId 视频id/直播间id |
1003 | 1004 | * @param type 1:视频, 2:直播 |
1004 | 1005 | */ |
1005 | - private File findLocalCacheImageUser(String theme, Long themeId, String account, String itemId, Integer type) { | |
1006 | + private File findLocalCacheImageUser(/*String theme,*/ Long themeId, String account, String itemId, Integer type) { | |
1006 | 1007 | String tempDir = common.getActivityThemeCoverDir(); |
1007 | - File file = new File(tempDir + File.separator + "activityTheme" + File.separator + themeId + "「" + theme + "」" + File.separator + account + File.separator + (Objects.equals(type, 1) ? "video" : "live")); | |
1008 | + File file = new File(tempDir + File.separator + "activityTheme" + File.separator + themeId /*+ "#" + theme*/ + File.separator + account + File.separator + (Objects.equals(type, 1) ? "video" : "live")); | |
1008 | 1009 | if (!file.exists()) { |
1009 | 1010 | boolean mkdirs = file.mkdirs(); |
1010 | 1011 | if (mkdirs) |
... | ... | @@ -1021,15 +1022,15 @@ public class CommonBizService { |
1021 | 1022 | } |
1022 | 1023 | |
1023 | 1024 | /** |
1024 | - * 获取本地已下载的主题背景图 | |
1025 | + * 获取本地已下载的主题背景图(主题预设封面图) | |
1025 | 1026 | * |
1026 | 1027 | * @param theme 主题名 |
1027 | 1028 | * @param themeId 主题id |
1028 | 1029 | * @param fileId 文件id(主题配置指定封面图文件) |
1029 | 1030 | */ |
1030 | - private File findLocalCacheImageTheme(String theme, Long themeId, String fileId) { | |
1031 | + private File findLocalCacheImageTheme(/*String theme,*/ Long themeId, String fileId) { | |
1031 | 1032 | String tempDir = common.getActivityThemeCoverDir(); |
1032 | - File file = new File(tempDir + "activityTheme" + File.separator + themeId + "「" + theme + "」" + File.separator + "settingCover"); | |
1033 | + File file = new File(tempDir + "activityTheme" + File.separator + themeId /*+ "#" + theme*/ + File.separator + "settingCover"); | |
1033 | 1034 | if (!file.exists()) { |
1034 | 1035 | boolean mkdirs = file.mkdirs(); |
1035 | 1036 | if (mkdirs) | ... | ... |
fw-dalaran-service/src/main/java/cn/fw/dalaran/service/biz/OtherBizService.java
1 | 1 | package cn.fw.dalaran.service.biz; |
2 | 2 | |
3 | -import cn.fw.dalaran.common.constants.DalaranConstants; | |
3 | +import cn.fw.dalaran.common.ConfigProperties; | |
4 | +import cn.fw.dalaran.common.constants.Constants; | |
4 | 5 | import cn.fw.dalaran.common.exception.BusinessException; |
5 | 6 | import cn.fw.dalaran.common.utils.PublicUtil; |
6 | 7 | import cn.fw.dalaran.common.utils.StringUtils; |
... | ... | @@ -43,6 +44,7 @@ import java.util.stream.Collectors; |
43 | 44 | public class OtherBizService { |
44 | 45 | @Value("${spring.profiles.active}") |
45 | 46 | private String env;// 获取系统当前环境 |
47 | + private final ConfigProperties configProperties; | |
46 | 48 | private final ActivityThemeService activityThemeService; |
47 | 49 | private final LivePoolService livePoolService; |
48 | 50 | private final LiveCheckResultService liveCheckResultService; |
... | ... | @@ -58,10 +60,10 @@ public class OtherBizService { |
58 | 60 | * @param themeId 主题id |
59 | 61 | * @return 审计视图 |
60 | 62 | */ |
61 | - @Transactional | |
63 | + @Transactional(rollbackFor = Exception.class) | |
62 | 64 | public LiveCheckVo getLiveCheck(Long userId, Long themeId) { |
63 | 65 | LiveCheckVo vo = new LiveCheckVo(); |
64 | - final List<ShopMsg> userRoleRange = userRoleRpcService.getUserRoleRange(userId, DalaranConstants.ZBSJ_ROLE_CODE);// 查询用户角色授权范围 | |
66 | + final List<ShopMsg> userRoleRange = userRoleRpcService.getUserRoleRange(userId, Constants.ZBSJ_ROLE_CODE);// 查询用户角色授权范围 | |
65 | 67 | List<LiveCheckResult> waitCheckLives = new ArrayList<>(); |
66 | 68 | List<LiveCheckResult> list = liveCheckResultService.lambdaQuery() |
67 | 69 | .eq(LiveCheckResult::getThemeId, themeId) |
... | ... | @@ -103,13 +105,13 @@ public class OtherBizService { |
103 | 105 | } |
104 | 106 | if (!CollectionUtils.isEmpty(waitCheckLives)) { |
105 | 107 | vo.setTheme(ActivityTheme.toVO(Objects.requireNonNull(activityThemeService.getById(themeId)))); |
106 | - vo.setLiveList(PublicUtil.copyList(waitCheckLives, LiveCheckVo.liveSummary.class).stream() | |
108 | + vo.setLiveList(PublicUtil.copyList(waitCheckLives, LiveCheckVo.LiveSummary.class).stream() | |
107 | 109 | .peek(item -> { |
108 | 110 | final LivePool live = livePoolService.getById(item.getLiveId()); |
109 | 111 | item.setTitle(live.getTitle()); |
110 | 112 | item.setPlaybackUrl(live.getPlaybackUrl()); |
111 | 113 | }) |
112 | - .sorted(Comparator.comparing(LiveCheckVo.liveSummary::getCounterfeit)) | |
114 | + .sorted(Comparator.comparing(LiveCheckVo.LiveSummary::getCounterfeit)) | |
113 | 115 | .collect(Collectors.toList()) |
114 | 116 | ); |
115 | 117 | } |
... | ... | @@ -123,7 +125,7 @@ public class OtherBizService { |
123 | 125 | * @param param 审核结果 |
124 | 126 | * @return 操作结果 |
125 | 127 | */ |
126 | - @Transactional | |
128 | + @Transactional(rollbackFor = Exception.class) | |
127 | 129 | public boolean saveCheckResult(Long userId, LiveCheckParams param) { |
128 | 130 | final Integer type = param.getType(); |
129 | 131 | final Long dataId = param.getDataId(); |
... | ... | @@ -172,7 +174,7 @@ public class OtherBizService { |
172 | 174 | liveCheckResult.setValid(Objects.equals(liveCheckResult.getCounterfeit(), 0) && Objects.equals(liveCheckResult.getPay(), 0) ? 1 : 0); |
173 | 175 | return liveCheckResultService.updateById(liveCheckResult); |
174 | 176 | } else if (Objects.equals(type, 1)) {// 完成待办 |
175 | - final List<LiveCheckVo.liveSummary> summaries = this.getLiveCheck(userId, dataId).getLiveList(); | |
177 | + final List<LiveCheckVo.LiveSummary> summaries = this.getLiveCheck(userId, dataId).getLiveList(); | |
176 | 178 | if (summaries.stream().anyMatch(item -> Objects.equals(item.getCounterfeit(), -1))) { |
177 | 179 | throw new BusinessException("还有未完成审核的直播, 请完成所有直播审核后重新提交"); |
178 | 180 | } else { |
... | ... | @@ -180,12 +182,12 @@ public class OtherBizService { |
180 | 182 | .set(TodoHistory::getDone, true) |
181 | 183 | .eq(TodoHistory::getUserId, userId) |
182 | 184 | .eq(TodoHistory::getDataId, dataId) |
183 | - .eq(TodoHistory::getTodoCode, DalaranConstants.CHECK_LIVE) | |
185 | + .eq(TodoHistory::getTodoCode, Constants.CHECK_LIVE) | |
184 | 186 | .update()) |
185 | 187 | throw new BusinessException("完成待办失败"); |
186 | 188 | final List<Long> invalidLiveIds = summaries.stream() |
187 | 189 | .filter(item -> Objects.equals(item.getValid(), 0)) |
188 | - .map(LiveCheckVo.liveSummary::getLiveId) | |
190 | + .map(LiveCheckVo.LiveSummary::getLiveId) | |
189 | 191 | .collect(Collectors.toList()); |
190 | 192 | if (!CollectionUtils.isEmpty(invalidLiveIds)) { |
191 | 193 | ActivityTheme activityTheme = activityThemeService.getById(param.getDataId()); |
... | ... | @@ -196,7 +198,8 @@ public class OtherBizService { |
196 | 198 | while (!flag && cnt < 5) { |
197 | 199 | if (cnt > 0) |
198 | 200 | LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1)); |
199 | - flag = this.sendGetRequest("http://" + (env.contains("prd") ? "" : "test") + "gate.feewee.cn/report2/debug/extract/data/dalaran?dateType=DAILY&type=Dalaran004D&date=" + | |
201 | + this.sendGetRequest(configProperties.getDelMapCache());// 清空缓存 | |
202 | + flag = this.sendGetRequest(configProperties.getReCalcScore() + | |
200 | 203 | sdf.format(activityTheme.getEndTime()) |
201 | 204 | ); |
202 | 205 | cnt++; |
... | ... | @@ -211,7 +214,7 @@ public class OtherBizService { |
211 | 214 | .set(LiveCheckResult::getStatus, type) |
212 | 215 | .in(LiveCheckResult::getId, summaries |
213 | 216 | .stream() |
214 | - .map(LiveCheckVo.liveSummary::getId) | |
217 | + .map(LiveCheckVo.LiveSummary::getId) | |
215 | 218 | .collect(Collectors.toList()) |
216 | 219 | ).update(); |
217 | 220 | } |
... | ... | @@ -225,9 +228,9 @@ public class OtherBizService { |
225 | 228 | * @param id |
226 | 229 | * @return |
227 | 230 | */ |
228 | - public LiveCheckVo.liveSummary getLiveCheckDetails(Long id) { | |
231 | + public LiveCheckVo.LiveSummary getLiveCheckDetails(Long id) { | |
229 | 232 | final LiveCheckResult checkResult = liveCheckResultService.getById(id); |
230 | - final LiveCheckVo.liveSummary liveSummary = PublicUtil.copy(checkResult, LiveCheckVo.liveSummary.class); | |
233 | + final LiveCheckVo.LiveSummary liveSummary = PublicUtil.copy(checkResult, LiveCheckVo.LiveSummary.class); | |
231 | 234 | final LivePool live = livePoolService.getById(checkResult.getLiveId()); |
232 | 235 | liveSummary.setTitle(live.getTitle()); |
233 | 236 | liveSummary.setPlaybackUrl(live.getPlaybackUrl()); | ... | ... |
fw-dalaran-service/src/main/java/cn/fw/dalaran/service/data/ActivityThemeService.java
... | ... | @@ -111,4 +111,11 @@ public interface ActivityThemeService extends IService<ActivityTheme> { |
111 | 111 | * @return 主题是否结束数据抓取 |
112 | 112 | */ |
113 | 113 | boolean themeHaveStopCatchData(Date themeEndTime, int delayDays); |
114 | + | |
115 | + /** | |
116 | + * 获取已经逻辑删除的主题列表 | |
117 | + * | |
118 | + * @return 已经逻辑删除的主题列表 | |
119 | + */ | |
120 | + List<ActivityTheme> getHasDelActivityTheme(); | |
114 | 121 | } | ... | ... |
fw-dalaran-service/src/main/java/cn/fw/dalaran/service/data/impl/ActivityThemeServiceImpl.java
... | ... | @@ -2,7 +2,8 @@ package cn.fw.dalaran.service.data.impl; |
2 | 2 | |
3 | 3 | import cn.fw.common.page.AppPage; |
4 | 4 | import cn.fw.common.web.auth.LoginAuthBean; |
5 | -import cn.fw.dalaran.common.constants.DalaranConstants; | |
5 | +import cn.fw.dalaran.common.ConfigProperties; | |
6 | +import cn.fw.dalaran.common.constants.Constants; | |
6 | 7 | import cn.fw.dalaran.common.exception.BusinessException; |
7 | 8 | import cn.fw.dalaran.common.utils.DateUtil; |
8 | 9 | import cn.fw.dalaran.common.utils.ImageUtils; |
... | ... | @@ -35,7 +36,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
35 | 36 | import com.google.common.collect.Lists; |
36 | 37 | import lombok.RequiredArgsConstructor; |
37 | 38 | import lombok.extern.slf4j.Slf4j; |
38 | -import org.springframework.beans.factory.annotation.Value; | |
39 | 39 | import org.springframework.context.event.EventListener; |
40 | 40 | import org.springframework.scheduling.annotation.Async; |
41 | 41 | import org.springframework.stereotype.Service; |
... | ... | @@ -59,8 +59,7 @@ import java.util.stream.Collectors; |
59 | 59 | @RequiredArgsConstructor |
60 | 60 | public class ActivityThemeServiceImpl extends ServiceImpl<ActivityThemeDao, ActivityTheme> implements ActivityThemeService { |
61 | 61 | |
62 | - @Value("${file-server-addr}") | |
63 | - private String serverAddr; | |
62 | + private final ConfigProperties configProperties; | |
64 | 63 | private final ActivityThemeDao activityThemeDao; |
65 | 64 | private final ConfigGroupService configGroupService; |
66 | 65 | private final ThemeFileService themeFileService; |
... | ... | @@ -83,7 +82,14 @@ public class ActivityThemeServiceImpl extends ServiceImpl<ActivityThemeDao, Acti |
83 | 82 | return themeList.stream() |
84 | 83 | .anyMatch(item -> validDateOverlap(item.getStartTime(), item.getEndTime(), vo.getStartTime(), vo.getEndTime()) &&// 验证时间重叠 |
85 | 84 | /*(Objects.equals(item.getAllShop(), 1) || vo.getAllShop() || validShopOverlap(Arrays.stream(item.getShopIds().split(",")).map(Long::valueOf).collect(Collectors.toList()), vo.getShopIds()))// 验证门店重叠*/ |
86 | - (Objects.equals(item.getAllShop(), 1) || configGroup.getAllShop() > 0 || validShopOverlap(Arrays.stream(item.getShopIds().split(",")).map(Long::valueOf).collect(Collectors.toList()), Arrays.stream(configGroup.getShopIds().split(",")).map(Long::valueOf).collect(Collectors.toList())))// 验证门店重叠 | |
85 | + (Objects.equals(item.getAllShop(), 1) || configGroup.getAllShop() > 0 || | |
86 | + validShopOverlap(Arrays.stream(item.getShopIds().split(",")) | |
87 | + .map(Long::valueOf) | |
88 | + .collect(Collectors.toList()), Arrays.stream(configGroup.getShopIds().split(",")) | |
89 | + .map(Long::valueOf) | |
90 | + .collect(Collectors.toList()) | |
91 | + ) | |
92 | + )// 验证门店重叠 | |
87 | 93 | ); |
88 | 94 | } |
89 | 95 | |
... | ... | @@ -125,7 +131,7 @@ public class ActivityThemeServiceImpl extends ServiceImpl<ActivityThemeDao, Acti |
125 | 131 | * @return |
126 | 132 | */ |
127 | 133 | @Override |
128 | - @Transactional | |
134 | + @Transactional(rollbackFor = Exception.class) | |
129 | 135 | public boolean save(ActivityThemeVo themeVo) { |
130 | 136 | ConfigGroup configGroup = configGroupService.getById(themeVo.getConfigGroupId()); |
131 | 137 | ActivityTheme activityTheme = ActivityThemeVo.toDB(themeVo); |
... | ... | @@ -140,9 +146,9 @@ public class ActivityThemeServiceImpl extends ServiceImpl<ActivityThemeDao, Acti |
140 | 146 | if (result) { |
141 | 147 | erpTaskRpc.setTask(TaskSetReq.<Long>builder() |
142 | 148 | .executeTime(new Date(activityTheme.getStartTime().getTime() + 24 * 3600 * 1000L)) |
143 | - .system(DalaranConstants.APPLICATION_NAME) | |
149 | + .system(Constants.APPLICATION_NAME) | |
144 | 150 | .param(activityTheme.getId()) |
145 | - .tag(DalaranConstants.INIT_ACCOUNT_STATUS) | |
151 | + .tag(Constants.INIT_ACCOUNT_STATUS) | |
146 | 152 | .build() |
147 | 153 | ); |
148 | 154 | this.saveFiles(activityTheme.getId(), themeVo.getAllFileDesc()); |
... | ... | @@ -189,7 +195,7 @@ public class ActivityThemeServiceImpl extends ServiceImpl<ActivityThemeDao, Acti |
189 | 195 | * @return |
190 | 196 | */ |
191 | 197 | @Override |
192 | - @Transactional | |
198 | + @Transactional(rollbackFor = Exception.class) | |
193 | 199 | public boolean addCover(AddThemeCoverParams params) { |
194 | 200 | Long themeId = params.getThemeId(); |
195 | 201 | List<FileDesc> fileList = params.getCovers() |
... | ... | @@ -363,9 +369,9 @@ public class ActivityThemeServiceImpl extends ServiceImpl<ActivityThemeDao, Acti |
363 | 369 | allFileDesc.forEach(item -> { |
364 | 370 | try { |
365 | 371 | String fileId = item.getFid(); |
366 | - File downloadFile = ImageUtils.convertFileByUrl(serverAddr + fileId, fileId); | |
372 | + File downloadFile = ImageUtils.convertFileByUrl(configProperties.getShow() + fileId, fileId); | |
367 | 373 | ImageUtils.modifyResolution1(downloadFile.getPath(), |
368 | - tempDir + "activityTheme" + File.separator + activityTheme.getId() + "「" + activityTheme.getTheme() + "」" + File.separator + "settingCover", | |
374 | + tempDir + "activityTheme" + File.separator + activityTheme.getId() /*+ "#" + activityTheme.getTheme()*/ + File.separator + "settingCover", | |
369 | 375 | "fw_theme_cover_" + fileId, |
370 | 376 | 512, 512); |
371 | 377 | boolean result = downloadFile.delete(); |
... | ... | @@ -376,6 +382,47 @@ public class ActivityThemeServiceImpl extends ServiceImpl<ActivityThemeDao, Acti |
376 | 382 | } |
377 | 383 | |
378 | 384 | /** |
385 | + * 活动主题数据封面图处理 | |
386 | + */ | |
387 | + public static void main(String[] args) { | |
388 | + int themeId = 85; | |
389 | + String tempDir = System.getProperty("java.io.tmpdir");// 获取当前环境临时文件夹路径 | |
390 | + Arrays.asList("26b284da426c41cda324f3a11568991f", | |
391 | + "417ac7dc65a641aea4153721742bcc71", | |
392 | + "57610873d190488baa29449d094f31db", | |
393 | + "5c3dc2e118ed436485185d9e4ee55bff", | |
394 | + "5e33ad337aa04b44988df9498c5ddd43", | |
395 | + "5f2caa0b050d4d63b6288ddb64c1748a", | |
396 | + "5f3650d43fba461588396db5d07ef5c6", | |
397 | + "71ff5e4eb1e8487c82b2f0f1e45fba3e", | |
398 | + "721292bc2515482cb49f841a2ec40b1a", | |
399 | + "78fe2f5e566047c7b6b41d227b77858c", | |
400 | + "81316e2bb88648119194dfabf986439e", | |
401 | + "924d99014f7a4223b86a67e669d34b61", | |
402 | + "a0af2e55e03a4c1c852a6c0e081bc49f", | |
403 | + "a804bee84e6d4084a123d729abe789fb", | |
404 | + "b0c6f5ba7e7d4300aea5b1312afb7f55", | |
405 | + "d478442fe3ee431b916d0f74ce72cf66", | |
406 | + "d4e2df114e0a42ec8eb3ff3b36a6e168", | |
407 | + "dd7f88410d124f8b8d15d2f142005ba0", | |
408 | + "e73c04b8011a45ff8162cfb0750a4aef", | |
409 | + "ea8d6dcad8d94be4b7234c076fe2363d", | |
410 | + "ee484477b9fd44ca8c096360312ca212") | |
411 | + .forEach(item -> { | |
412 | + try { | |
413 | + File downloadFile = ImageUtils.convertFileByUrl("https://gate.feewee.cn/file/show?fid=" + item, item); | |
414 | + ImageUtils.modifyResolution(downloadFile.getPath(), | |
415 | + tempDir + "activityTheme" + File.separator + themeId /*+ "#" + activityTheme.getTheme()*/ + File.separator + "settingCover", | |
416 | + "fw_theme_cover_" + item, | |
417 | + 512, 512); | |
418 | + boolean result = downloadFile.delete(); | |
419 | + } catch (Exception e) { | |
420 | + log.error("下载转换封面图失败", e); | |
421 | + } | |
422 | + }); | |
423 | + } | |
424 | + | |
425 | + /** | |
379 | 426 | * 监听器, 收到消息后执行更新主题信息 |
380 | 427 | * |
381 | 428 | * @param msg 消息 |
... | ... | @@ -435,4 +482,14 @@ public class ActivityThemeServiceImpl extends ServiceImpl<ActivityThemeDao, Acti |
435 | 482 | );// 设置文件信息 |
436 | 483 | } |
437 | 484 | |
485 | + /** | |
486 | + * 获取已经逻辑删除的主题列表 | |
487 | + * | |
488 | + * @return 已经逻辑删除的主题列表 | |
489 | + */ | |
490 | + @Override | |
491 | + public List<ActivityTheme> getHasDelActivityTheme() { | |
492 | + return activityThemeDao.getHasDelActivityTheme(); | |
493 | + } | |
494 | + | |
438 | 495 | } | ... | ... |
fw-dalaran-service/src/main/java/cn/fw/dalaran/service/data/impl/ConfigGroupServiceImpl.java
1 | 1 | package cn.fw.dalaran.service.data.impl; |
2 | 2 | |
3 | -import cn.fw.dalaran.common.constants.DalaranConstants; | |
3 | +import cn.fw.dalaran.common.constants.Constants; | |
4 | 4 | import cn.fw.dalaran.common.exception.BusinessException; |
5 | 5 | import cn.fw.dalaran.dao.ConfigGroupDao; |
6 | 6 | import cn.fw.dalaran.domain.db.ActivityTheme; |
... | ... | @@ -66,14 +66,15 @@ public class ConfigGroupServiceImpl extends ServiceImpl<ConfigGroupDao, ConfigGr |
66 | 66 | * @return |
67 | 67 | */ |
68 | 68 | @Override |
69 | - @Transactional | |
69 | + @Transactional(rollbackFor = Exception.class) | |
70 | 70 | public ConfigGroupVo init(Long userId, Long groupId) { |
71 | - if (this.lambdaQuery() | |
71 | + if (!this.lambdaQuery() | |
72 | 72 | .eq(ConfigGroup::getGroupId, groupId) |
73 | 73 | .eq(ConfigGroup::getUserId, userId) |
74 | 74 | .eq(ConfigGroup::getAllShop, -2) |
75 | - .list().size() > 0) | |
76 | - throw new BusinessException("该用户存在一个已初始化但未赋值修改的配置组"); | |
75 | + .list() | |
76 | + .isEmpty() | |
77 | + ) throw new BusinessException("该用户存在一个已初始化但未赋值修改的配置组"); | |
77 | 78 | ConfigGroup configGroup = new ConfigGroup(); |
78 | 79 | configGroup.setUserId(userId); |
79 | 80 | configGroup.setGroupId(groupId); |
... | ... | @@ -94,7 +95,7 @@ public class ConfigGroupServiceImpl extends ServiceImpl<ConfigGroupDao, ConfigGr |
94 | 95 | * @return |
95 | 96 | */ |
96 | 97 | @Override |
97 | - @Transactional | |
98 | + @Transactional(rollbackFor = Exception.class) | |
98 | 99 | public boolean update(Long userId, ConfigGroupVo param) { |
99 | 100 | if (!Objects.equals(userId, param.getUserId())) |
100 | 101 | throw new BusinessException("不允许修改别人的配置组"); |
... | ... | @@ -105,14 +106,14 @@ public class ConfigGroupServiceImpl extends ServiceImpl<ConfigGroupDao, ConfigGr |
105 | 106 | .list();// 找到对应集团的所有生效的配置组 |
106 | 107 | Integer allShop = param.getAllShop(); |
107 | 108 | if (Objects.equals(allShop, 1)) {// 本次指定配置是否为全部门店 |
108 | - if (list.size() > 0) throw new BusinessException("该集团已存在门店配置, 新配置不能设置为[全部门店]"); | |
109 | + if (!list.isEmpty()) throw new BusinessException("该集团已存在门店配置, 新配置不能设置为[全部门店]"); | |
109 | 110 | } else if (list.stream().anyMatch(item -> Objects.equals(item.getAllShop(), 1))) {// 已存在的配置组是否有全部门店的 |
110 | 111 | throw new BusinessException("该集团已存在[全部门店]配置, 新配置不能生效"); |
111 | 112 | } else { |
112 | 113 | List<Long> shopIds = param.getShopIds();// 本次配置指定生效门店 |
113 | 114 | List<String> shopNames = param.getShopNames();// 本次配置指定生效门店 |
114 | 115 | if (Objects.equals(allShop, -1)) {// 指定为授权门店 |
115 | - List<ShopMsg> userRoleRange = userRoleRpcService.getUserRoleRange(param.getUserId(), DalaranConstants.ZBSZ_ROLE_CODE);// 查询用户角色授权范围 | |
116 | + List<ShopMsg> userRoleRange = userRoleRpcService.getUserRoleRange(param.getUserId(), Constants.ZBSZ_ROLE_CODE);// 查询用户角色授权范围 | |
116 | 117 | shopIds.clear(); |
117 | 118 | shopNames.clear(); |
118 | 119 | for (ShopMsg shopMsg : userRoleRange) { |
... | ... | @@ -201,20 +202,20 @@ public class ConfigGroupServiceImpl extends ServiceImpl<ConfigGroupDao, ConfigGr |
201 | 202 | */ |
202 | 203 | @Override |
203 | 204 | public List<ConfigGroupVo> queryList(Long userId, Long groupId) { |
204 | - List<ConfigGroupVo> collect = this.lambdaQuery() | |
205 | + Map<Long, List<ConfigGroupVo>> collectMap = this.lambdaQuery() | |
205 | 206 | .eq(ConfigGroup::getGroupId, groupId) |
206 | 207 | .list() |
207 | 208 | .stream() |
208 | 209 | .map(item -> this.processVo(item, true)) |
209 | - .collect(Collectors.toList()); | |
210 | - Map<Long, List<ConfigGroupVo>> collectMap = collect.stream() | |
211 | 210 | .collect(Collectors.groupingBy(ConfigGroupVo::getUserId)); |
212 | 211 | List<ConfigGroupVo> vos = new ArrayList<>(Optional |
213 | 212 | .ofNullable(collectMap.get(userId)) |
214 | 213 | .orElse(new ArrayList<>()) |
215 | 214 | );// 尝试获取属于登录用户的配置组 |
215 | + /* 下面两步操作, 为了让属于自己的配置组能展示在最前面 */ | |
216 | 216 | collectMap.remove(userId);// 将属于该用户的配置从map中移除 |
217 | 217 | collectMap.forEach((k, v) -> vos.addAll(v));// 将其他人的配置组加入vo |
218 | + vos.forEach(item -> item.setCanAlter(Objects.equals(item.getUserId(), userId)));// 标记是否是自己的配置组 | |
218 | 219 | return vos; |
219 | 220 | } |
220 | 221 | ... | ... |
fw-dalaran-service/src/main/java/cn/fw/dalaran/service/data/impl/GlobalConfigServiceImpl.java
... | ... | @@ -6,6 +6,7 @@ import cn.fw.dalaran.domain.db.GlobalConfig; |
6 | 6 | import cn.fw.dalaran.domain.enums.ConfigEnum; |
7 | 7 | import cn.fw.dalaran.service.data.GlobalConfigService; |
8 | 8 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
9 | +import org.springframework.beans.factory.annotation.Autowired; | |
9 | 10 | import org.springframework.stereotype.Service; |
10 | 11 | import org.springframework.transaction.annotation.Transactional; |
11 | 12 | |
... | ... | @@ -25,6 +26,13 @@ import java.util.stream.Collectors; |
25 | 26 | @Service("globalConfigService") |
26 | 27 | public class GlobalConfigServiceImpl extends ServiceImpl<GlobalConfigDao, GlobalConfig> implements GlobalConfigService { |
27 | 28 | |
29 | + private GlobalConfigServiceImpl globalConfigService; | |
30 | + | |
31 | + @Autowired | |
32 | + public void inject(GlobalConfigServiceImpl globalConfigService) { | |
33 | + this.globalConfigService = globalConfigService; | |
34 | + } | |
35 | + | |
28 | 36 | /** |
29 | 37 | * 获取列表 |
30 | 38 | * |
... | ... | @@ -39,6 +47,7 @@ public class GlobalConfigServiceImpl extends ServiceImpl<GlobalConfigDao, Global |
39 | 47 | .list();// 获取数据库中的配置列表 |
40 | 48 | final int length = ConfigEnum.values().length;// 获取枚举中规定的配置数 |
41 | 49 | if (list.size() != length) { |
50 | + //list = ((GlobalConfigServiceImpl) AopContext.currentProxy()).initConfigList(configGroupId); | |
42 | 51 | list = this.initConfigList(configGroupId); |
43 | 52 | } |
44 | 53 | return list; |
... | ... | @@ -51,8 +60,10 @@ public class GlobalConfigServiceImpl extends ServiceImpl<GlobalConfigDao, Global |
51 | 60 | */ |
52 | 61 | @Override |
53 | 62 | public void updateConfig(List<GlobalConfig.GlobalConfigVo> globalConfigs) { |
54 | - PublicUtil.assertFalse(globalConfigs.stream().anyMatch(item -> item.getRate().compareTo(BigDecimal.ZERO) < 0), "占比必须 > 0%"); | |
55 | - PublicUtil.assertFalse(globalConfigs.stream().anyMatch(item -> item.getRate().compareTo(BigDecimal.valueOf(100)) > 0), "占比必须 < 100%"); | |
63 | + PublicUtil.assertFalse(globalConfigs.stream() | |
64 | + .anyMatch(item -> item.getRate().compareTo(BigDecimal.ZERO) < 0), "占比必须 > 0%"); | |
65 | + PublicUtil.assertFalse(globalConfigs.stream() | |
66 | + .anyMatch(item -> item.getRate().compareTo(BigDecimal.valueOf(100)) > 0), "占比必须 < 100%"); | |
56 | 67 | this.saveOrUpdateBatch(PublicUtil.copyList(globalConfigs, GlobalConfig.class)); |
57 | 68 | } |
58 | 69 | |
... | ... | @@ -62,7 +73,7 @@ public class GlobalConfigServiceImpl extends ServiceImpl<GlobalConfigDao, Global |
62 | 73 | * @param configGroupId 所属配置组id |
63 | 74 | * @return |
64 | 75 | */ |
65 | - @Transactional | |
76 | + @Transactional(rollbackFor = Exception.class) | |
66 | 77 | public List<GlobalConfig> initConfigList(Long configGroupId) { |
67 | 78 | final List<GlobalConfig> list = this.lambdaQuery() |
68 | 79 | .eq(GlobalConfig::getConfigGroupId, configGroupId) |
... | ... | @@ -76,13 +87,15 @@ public class GlobalConfigServiceImpl extends ServiceImpl<GlobalConfigDao, Global |
76 | 87 | List<GlobalConfig> collect1 = list.stream() |
77 | 88 | .filter(item1 -> Objects.equals(item.getValue(), item1.getType())) |
78 | 89 | .collect(Collectors.toList()); |
79 | - if (collect1.size() > 0) { | |
90 | + if (!collect1.isEmpty()) { | |
80 | 91 | rate = collect1.get(0).getRate(); |
81 | 92 | } |
82 | 93 | return new GlobalConfig(configGroupId, item.getValue(), rate); |
83 | 94 | }) |
84 | 95 | .collect(Collectors.toList()); |
85 | 96 | this.saveBatch(collect); |
97 | + //int i = 1 / 0; | |
86 | 98 | return collect; |
87 | 99 | } |
100 | + | |
88 | 101 | } | ... | ... |
fw-dalaran-service/src/main/java/cn/fw/dalaran/service/data/impl/LivePoolServiceImpl.java
... | ... | @@ -87,7 +87,7 @@ public class LivePoolServiceImpl extends ServiceImpl<LivePoolDao, LivePool> impl |
87 | 87 | * @return |
88 | 88 | */ |
89 | 89 | @Override |
90 | - @Transactional | |
90 | + @Transactional(rollbackFor = Exception.class) | |
91 | 91 | public boolean markBestLive(Long liveId) { |
92 | 92 | final LivePool live = this.getById(liveId); |
93 | 93 | final Long themeId = live.getThemeId();// 获取主题id | ... | ... |
fw-dalaran-service/src/main/java/cn/fw/dalaran/service/data/impl/ValidConfigNewServiceImpl.java
... | ... | @@ -38,7 +38,7 @@ public class ValidConfigNewServiceImpl extends ServiceImpl<ValidConfigNewDao, Va |
38 | 38 | * @return |
39 | 39 | */ |
40 | 40 | @Override |
41 | - @Transactional | |
41 | + @Transactional(rollbackFor = Exception.class) | |
42 | 42 | public boolean updateConfig(List<ValidConfigNewVo.singleVo> details) { |
43 | 43 | details.forEach(item -> this.updateById(ValidConfigNewVo.toDB(item))); |
44 | 44 | publisher.publishEvent("validConfigAlertEvent#" + details.get(0).getConfigGroupId()); |
... | ... | @@ -84,7 +84,7 @@ public class ValidConfigNewServiceImpl extends ServiceImpl<ValidConfigNewDao, Va |
84 | 84 | * @param configGroupId 所属配置组id |
85 | 85 | * @return |
86 | 86 | */ |
87 | - @Transactional | |
87 | + @Transactional(rollbackFor = Exception.class) | |
88 | 88 | public List<ValidConfigNew> initVideoConfigList(Long configGroupId) { |
89 | 89 | final List<ValidConfigNew> list = this.lambdaQuery() |
90 | 90 | .eq(ValidConfigNew::getConfigGroupId, configGroupId) |
... | ... | @@ -115,7 +115,7 @@ public class ValidConfigNewServiceImpl extends ServiceImpl<ValidConfigNewDao, Va |
115 | 115 | * @param configGroupId 所属配置组id |
116 | 116 | * @return |
117 | 117 | */ |
118 | - @Transactional | |
118 | + @Transactional(rollbackFor = Exception.class) | |
119 | 119 | public List<ValidConfigNew> initLiveConfigList(Long configGroupId) { |
120 | 120 | final List<ValidConfigNew> list = this.lambdaQuery() |
121 | 121 | .eq(ValidConfigNew::getConfigGroupId, configGroupId) | ... | ... |
fw-dalaran-service/src/main/test/codeGenerator/CodeGenerator.java
1 | 1 | package codeGenerator; |
2 | 2 | |
3 | -import com.baomidou.mybatisplus.annotation.DbType; | |
4 | -import com.baomidou.mybatisplus.annotation.FieldFill; | |
5 | -import com.baomidou.mybatisplus.annotation.IdType; | |
6 | -import com.baomidou.mybatisplus.generator.AutoGenerator; | |
7 | -import com.baomidou.mybatisplus.generator.config.DataSourceConfig; | |
8 | -import com.baomidou.mybatisplus.generator.config.GlobalConfig; | |
9 | -import com.baomidou.mybatisplus.generator.config.PackageConfig; | |
10 | -import com.baomidou.mybatisplus.generator.config.StrategyConfig; | |
11 | -import com.baomidou.mybatisplus.generator.config.po.TableFill; | |
12 | -import com.baomidou.mybatisplus.generator.config.rules.DateType; | |
13 | -import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; | |
14 | 3 | import org.junit.Test; |
15 | 4 | |
16 | -import java.util.ArrayList; | |
17 | - | |
18 | 5 | public class CodeGenerator { |
19 | 6 | |
20 | 7 | @Test |
21 | 8 | public void getCode() { |
22 | - // 1、全局配置 | |
9 | + /*// 1、全局配置 | |
23 | 10 | GlobalConfig globalConfig = new GlobalConfig(); |
24 | 11 | globalConfig |
25 | 12 | .setOutputDir("D:\\Users\\wmy\\feiweiProjects\\fw-dalaran\\fw-dalaran-domain\\src\\main\\java\\codeGenerate" + "/src/main/java")//1.修改为你项目的目录 |
... | ... | @@ -80,7 +67,7 @@ public class CodeGenerator { |
80 | 67 | .setPackageInfo(packageConfig) |
81 | 68 | .setStrategy(strategyConfig); |
82 | 69 | // 7、执行 |
83 | - autoGenerator.execute(); | |
70 | + autoGenerator.execute();*/ | |
84 | 71 | } |
85 | 72 | |
86 | 73 | } | ... | ... |
fw-dalaran-service/src/main/test/example/ImageListener.java
... | ... | @@ -19,8 +19,8 @@ public class ImageListener implements ActionListener { |
19 | 19 | } |
20 | 20 | |
21 | 21 | public ImageListener() throws Exception { |
22 | - File imageFile1 = ImageUtils.convertFileByUrl("https://gate.feewee.cn/file/show?fid=e1d71b45dd0e4d73bde25afc3e260de5"); | |
23 | - File imageFile2 = ImageUtils.convertFileByUrl("https://gate.feewee.cn/file/show?fid=7dfedbed8996443584b6b2221b79235e"); | |
22 | + File imageFile1 = ImageUtils.convertFileByUrl("https://gate.feewee.cn/file/show?fid=0684ce9b0d384ff1a1070c61b7ed376c"); | |
23 | + File imageFile2 = ImageUtils.convertFileByUrl("https://gate.feewee.cn/file/show?fid=0aff5b6acf6040459b6d5e69f1290c3b"); | |
24 | 24 | //File imageFile2 = ImageUtils.convertFileByUrl("https://p2.a.yximgs.com/upic/2022/01/20/20/BMjAyMjAxMjAyMDEyMTZfNDcwOTM0NDgyXzY1MzMwMDA5Mjk0XzJfMw==_B0296c8ed5afa94b9b7a06dd1612c3ecb.jpg?tag=1-1642748356-nil-0-ndrgo4aid6-21e0d82706b2e935&clientCacheKey=3x4xb3uvxtpibvc.jpg&di=abd4f314&bp=10000"); |
25 | 25 | /*File imageFile1 = new File("C:\\Users\\wmy3969\\Desktop\\2.png"); |
26 | 26 | File imageFile2 = new File("C:\\Users\\wmy3969\\Desktop\\2022.4.23-4.30短视频背景封面jpg\\春风十里焕新鲸喜\\1.png");*/ | ... | ... |
pom.xml
... | ... | @@ -41,6 +41,7 @@ |
41 | 41 | <fw.attendance.sdk.version>1.0.0</fw.attendance.sdk.version> |
42 | 42 | <fw.notice.sdk.version>1.0.0</fw.notice.sdk.version> |
43 | 43 | <fw.rocketmq.sdk.version>1.0</fw.rocketmq.sdk.version> |
44 | + <fw.morax.sdk.version>1.0.0</fw.morax.sdk.version> | |
44 | 45 | <fastjson>1.2.78</fastjson> |
45 | 46 | <fw-oop-sdk.version>3.0.0</fw-oop-sdk.version> |
46 | 47 | <mybatis-typehandlers-jsr310>1.0.1</mybatis-typehandlers-jsr310> |
... | ... | @@ -147,6 +148,12 @@ |
147 | 148 | <artifactId>fw-backlog-sdk</artifactId> |
148 | 149 | <version>${fw.backlog.sdk}</version> |
149 | 150 | </dependency> |
151 | + <!-- 绩效系统 --> | |
152 | + <dependency> | |
153 | + <groupId>cn.fw</groupId> | |
154 | + <artifactId>fw-morax-sdk</artifactId> | |
155 | + <version>${fw.morax.sdk.version}</version> | |
156 | + </dependency> | |
150 | 157 | <dependency> |
151 | 158 | <groupId>cn.fw</groupId> |
152 | 159 | <artifactId>fw-erp-sdk</artifactId> |
... | ... | @@ -167,6 +174,11 @@ |
167 | 174 | <artifactId>mybatis-typehandlers-jsr310</artifactId> |
168 | 175 | <version>${mybatis-typehandlers-jsr310}</version> |
169 | 176 | </dependency> |
177 | + <dependency> | |
178 | + <groupId>org.springframework.boot</groupId> | |
179 | + <artifactId>spring-boot-configuration-processor</artifactId> | |
180 | + <version>2.1.12.RELEASE</version> | |
181 | + </dependency> | |
170 | 182 | |
171 | 183 | <!-- image图片工具需要 start --> |
172 | 184 | <dependency> |
... | ... | @@ -192,17 +204,17 @@ |
192 | 204 | <artifactId>mybatis-plus-boot-starter</artifactId> |
193 | 205 | <version>3.3.2</version> |
194 | 206 | </dependency> |
195 | - <dependency> | |
207 | + <!--<dependency> | |
196 | 208 | <groupId>com.baomidou</groupId> |
197 | 209 | <artifactId>mybatis-plus-generator</artifactId> |
198 | 210 | <version>3.3.2</version> |
199 | - </dependency> | |
211 | + </dependency>--> | |
200 | 212 | <!-- 默认模板引擎, 可以选择自己熟悉的模板引擎(Freemarker、Beetl) --> |
201 | - <dependency> | |
213 | + <!--<dependency> | |
202 | 214 | <groupId>org.apache.velocity</groupId> |
203 | 215 | <artifactId>velocity-engine-core</artifactId> |
204 | 216 | <version>2.0</version> |
205 | - </dependency> | |
217 | + </dependency>--> | |
206 | 218 | <!-- mybatis-plus 代码生成器 end --> |
207 | 219 | <!-- 图片分辨率修改 --> |
208 | 220 | <dependency> | ... | ... |