From c45d7d2d2f364a5f0d5da65caa591f924150e989 Mon Sep 17 00:00:00 2001 From: yqy Date: Mon, 4 Sep 2023 15:29:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AD=A3=E5=BC=8F=E7=8E=AF=E5=A2=83=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ad-distribute-common/common-i18n/pom.xml | 49 ---- .../java/com/baiye/DynamicMessageSource.java | 32 --- .../src/main/java/com/baiye/I18nClass.java | 16 -- .../src/main/java/com/baiye/I18nField.java | 41 --- .../src/main/java/com/baiye/I18nIgnore.java | 15 -- .../src/main/java/com/baiye/I18nMessage.java | 38 --- .../com/baiye/I18nMessageCreateEvent.java | 23 -- .../java/com/baiye/I18nMessageProvider.java | 20 -- .../src/main/java/com/baiye/I18nOptions.java | 23 -- .../java/com/baiye/I18nResponseAdvice.java | 237 ------------------ .../MessageSourceHierarchicalChanger.java | 41 --- ...ReloadableResourceBundleMessageSource.java | 76 ------ .../resources/ballcat-i18nMessage.properties | 3 - .../ballcat-i18nMessage_en_US.properties | 3 - .../ballcat-i18nMessage_zh_CN.properties | 3 - .../com/baiye/DefautlI18nMessageProvider.java | 34 --- .../src/main/java/com/baiye/result/R.java | 2 +- ad-distribute-common/pom.xml | 1 - .../baiye/security/util/PasswordUtils.java | 1 - .../com/baiye/job/JobApplicationRunner.java | 47 ++-- .../main/java/com/baiye/job/LinkWatchJob.java | 5 +- .../controller/ClueFileController.java | 27 +- .../ClueFollowRecordController.java | 38 +++ .../modules/distribute/dto/DBPushClueDTO.java | 25 +- .../entity/ClueFollowRecordEntity.java | 46 ++++ .../distribute/entity/ClueStageEntity.java | 6 + .../entity/DistributeTaskEntity.java | 4 +- .../mapper/ClueFollowRecordMapper.java | 8 + .../distribute/mapper/ClueRecordMapper.java | 3 +- .../distribute/service/ClueFileService.java | 7 +- .../service/ClueFollowRecordService.java | 10 + .../service/impl/ClueFileServiceImpl.java | 28 ++- .../impl/ClueFollowRecordServiceImpl.java | 35 +++ .../service/impl/ClueRecordServiceImpl.java | 3 +- .../service/impl/ClueServiceImpl.java | 53 +++- .../impl/DistributeTaskServiceImpl.java | 217 ++++++++-------- .../service/impl/OutsideReqServiceImpl.java | 2 +- .../service/impl/PushLinkServiceImpl.java | 4 +- .../main/java/com/baiye/task/SyncTask.java | 1 - .../com/baiye/utils/ClueFileTestingUtil.java | 9 +- admin/src/main/resources/application-dev.yml | 2 +- admin/src/main/resources/application-prod.yml | 26 +- admin/src/main/resources/application-test.yml | 2 +- admin/src/main/resources/application.yml | 38 +-- admin/src/main/resources/file/template.xlsx | Bin 10166 -> 9896 bytes admin/src/main/resources/logback-spring.xml | 2 +- .../resources/mapper/ClueRecordMapper.xml | 5 +- 47 files changed, 403 insertions(+), 908 deletions(-) delete mode 100644 ad-distribute-common/common-i18n/pom.xml delete mode 100644 ad-distribute-common/common-i18n/src/main/java/com/baiye/DynamicMessageSource.java delete mode 100644 ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nClass.java delete mode 100644 ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nField.java delete mode 100644 ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nIgnore.java delete mode 100644 ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nMessage.java delete mode 100644 ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nMessageCreateEvent.java delete mode 100644 ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nMessageProvider.java delete mode 100644 ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nOptions.java delete mode 100644 ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nResponseAdvice.java delete mode 100644 ad-distribute-common/common-i18n/src/main/java/com/baiye/MessageSourceHierarchicalChanger.java delete mode 100644 ad-distribute-common/common-i18n/src/main/java/com/baiye/WildcardReloadableResourceBundleMessageSource.java delete mode 100644 ad-distribute-common/common-i18n/src/main/resources/ballcat-i18nMessage.properties delete mode 100644 ad-distribute-common/common-i18n/src/main/resources/ballcat-i18nMessage_en_US.properties delete mode 100644 ad-distribute-common/common-i18n/src/main/resources/ballcat-i18nMessage_zh_CN.properties delete mode 100644 ad-distribute-common/common-i18n/src/test/java/com/baiye/DefautlI18nMessageProvider.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/controller/ClueFollowRecordController.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/entity/ClueFollowRecordEntity.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/mapper/ClueFollowRecordMapper.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/service/ClueFollowRecordService.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/service/impl/ClueFollowRecordServiceImpl.java diff --git a/ad-distribute-common/common-i18n/pom.xml b/ad-distribute-common/common-i18n/pom.xml deleted file mode 100644 index 50f3fd1..0000000 --- a/ad-distribute-common/common-i18n/pom.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - ad-distribute-common - com.baiye - 1.1.0 - - 4.0.0 - common-i18n - - - - cn.hutool - hutool-core - - - io.swagger.core.v3 - swagger-annotations - - - jakarta.annotation - jakarta.annotation-api - - - jakarta.validation - jakarta.validation-api - - - - org.slf4j - slf4j-api - - - org.springframework - spring-context - - - org.springframework - spring-web - true - - - org.springframework - spring-webmvc - true - - - diff --git a/ad-distribute-common/common-i18n/src/main/java/com/baiye/DynamicMessageSource.java b/ad-distribute-common/common-i18n/src/main/java/com/baiye/DynamicMessageSource.java deleted file mode 100644 index b541e2d..0000000 --- a/ad-distribute-common/common-i18n/src/main/java/com/baiye/DynamicMessageSource.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baiye; - -import lombok.RequiredArgsConstructor; -import org.springframework.context.support.AbstractMessageSource; -import org.springframework.lang.Nullable; - -import java.text.MessageFormat; -import java.util.Locale; - -/** - * 动态获取的 MessageSource,比如从数据库 或者 redis 中获取 message 信息 - * - * @author hccake - */ -@RequiredArgsConstructor -public class DynamicMessageSource extends AbstractMessageSource { - - public static final String DYNAMIC_MESSAGE_SOURCE_BEAN_NAME = "dynamicMessageSource"; - - private final I18nMessageProvider i18nMessageProvider; - - @Override - @Nullable - protected MessageFormat resolveCode(String code, Locale locale) { - I18nMessage i18nMessage = i18nMessageProvider.getI18nMessage(code, locale); - if (i18nMessage != null) { - return createMessageFormat(i18nMessage.getMessage(), locale); - } - return null; - } - -} diff --git a/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nClass.java b/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nClass.java deleted file mode 100644 index a104355..0000000 --- a/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nClass.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baiye; - -import java.lang.annotation.*; - -/** - * 标注于需要国际化处理的类上, 配合 {@link I18nField} 使用,在响应时进行国际化处理 - * - * @see I18nResponseAdvice - * @author hccake - */ -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface I18nClass { - -} diff --git a/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nField.java b/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nField.java deleted file mode 100644 index df7cb0a..0000000 --- a/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nField.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baiye; - -import org.springframework.core.annotation.AliasFor; - -import java.lang.annotation.*; - -/** - * 用于标注在需要国际化的 String 类型的属性上,用于标记其需要国际化。 必须在拥有 {@link I18nClass} 注解标记的类上 - * - * @author hccake - */ -@Target(ElementType.FIELD) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface I18nField { - - /** - *

- * This is an alias for {@link #code} - *

- * @return String - */ - @AliasFor("code") - String value() default ""; - - /** - * 使用(SpEL 表达式)获取国际化code, 1,默认未 “”,表示则使用被标注的元素的值作为 code 2, 指定国际化的唯一标识属性,被指定的属性的值作为 - * code ,当不传值时,则使用被标注的元素的值作为 code (可选) 目前支持属性类型为: String & Number(将会格式化为String) 示例: - * "title" 3,为了防止重复code可添加添加一个前缀 prefix(可选) 示例: "'prefix'+ "title" - * @return String - */ - @AliasFor("value") - String code() default ""; - - /** - * 是否进行国际化的条件判断语句(SpEL 表达式),默认未 “”,表示永远翻译 - * @return 返回 boolean 的 SpEL 表达式 - */ - String condition() default ""; - -} diff --git a/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nIgnore.java b/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nIgnore.java deleted file mode 100644 index dc95c41..0000000 --- a/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nIgnore.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.baiye; - -import java.lang.annotation.*; - -/** - * 用于标注在需要国际化的 方法上,用于标记其需要国际化。 - * - * @author hccake - */ -@Target({ ElementType.METHOD }) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface I18nIgnore { - -} diff --git a/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nMessage.java b/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nMessage.java deleted file mode 100644 index 5badbc8..0000000 --- a/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nMessage.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.baiye; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; - -/** - * 对标于 message bundle 的文件消息的抽象 - * - * @author hccake - */ -@Data -@Schema(title = "国际化信息") -public class I18nMessage { - - /** - * 国际化标识 - */ - @NotEmpty(message = "{i18nMessage.code}:{}") - @Schema(title = "国际化标识") - private String code; - - /** - * 消息 - */ - @NotEmpty(message = "{i18nMessage.message}:{}") - @Schema(title = "文本值,可以使用 { } 加角标,作为占位符") - private String message; - - /** - * 地区语言标签 - */ - @NotEmpty(message = "{i18nMessage.languageTag}:{}") - @Schema(title = "语言标签") - private String languageTag; - -} diff --git a/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nMessageCreateEvent.java b/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nMessageCreateEvent.java deleted file mode 100644 index 99ddd5e..0000000 --- a/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nMessageCreateEvent.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baiye; - -import org.springframework.context.ApplicationEvent; - -import java.util.List; - -/** - * I18nMessage 的创建事件,Listener 监听此事件,进行 I18nMessage 的存储 - * - * @author hccake - */ -public class I18nMessageCreateEvent extends ApplicationEvent { - - public I18nMessageCreateEvent(List i18nMessages) { - super(i18nMessages); - } - - @SuppressWarnings("unchecked") - public List getI18nMessages() { - return (List) super.getSource(); - } - -} diff --git a/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nMessageProvider.java b/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nMessageProvider.java deleted file mode 100644 index ee4821c..0000000 --- a/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nMessageProvider.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.baiye; - -import java.util.Locale; - -/** - * 国际化信息的提供者,使用者实现此接口,用于从数据库或者缓存中读取数据 - * - * @author hccake - */ -public interface I18nMessageProvider { - - /** - * 获取 I18nMessage 对象 - * @param code 国际化唯一标识 - * @param locale 语言 - * @return 国际化消息 - */ - I18nMessage getI18nMessage(String code, Locale locale); - -} diff --git a/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nOptions.java b/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nOptions.java deleted file mode 100644 index 994d4ba..0000000 --- a/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nOptions.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baiye; - -import lombok.Data; -import org.springframework.stereotype.Component; - -/** - * @author hccake - */ -@Data -@Component -public class I18nOptions { - - /** - * 如果没有找到指定 languageTag 的语言配置时,需要回退的 languageTag,不配置则表示不回退 - */ - private String fallbackLanguageTag = "zh-CN"; - - /** - * 是否使用消息代码作为默认消息而不是抛出“NoSuchMessageException”。 - */ - private boolean useCodeAsDefaultMessage = true; - -} diff --git a/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nResponseAdvice.java b/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nResponseAdvice.java deleted file mode 100644 index cc1229e..0000000 --- a/ad-distribute-common/common-i18n/src/main/java/com/baiye/I18nResponseAdvice.java +++ /dev/null @@ -1,237 +0,0 @@ -package com.baiye; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.text.CharSequenceUtil; -import cn.hutool.core.util.ReflectUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.MessageSource; -import org.springframework.context.NoSuchMessageException; -import org.springframework.context.i18n.LocaleContextHolder; -import org.springframework.core.MethodParameter; -import org.springframework.core.annotation.AnnotationUtils; -import org.springframework.expression.Expression; -import org.springframework.expression.ExpressionParser; -import org.springframework.expression.spel.standard.SpelExpressionParser; -import org.springframework.http.MediaType; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.server.ServerHttpRequest; -import org.springframework.http.server.ServerHttpResponse; -import org.springframework.web.bind.annotation.RestControllerAdvice; -import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; - -import java.lang.reflect.AnnotatedElement; -import java.lang.reflect.Field; -import java.util.Collection; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; - -/** - * 利用 ResponseBodyAdvice 对返回结果进行国际化处理 - * - * @author Yakir - * @author hccake - */ -@Slf4j -@RestControllerAdvice -public class I18nResponseAdvice implements ResponseBodyAdvice { - - private final MessageSource messageSource; - - private final boolean useCodeAsDefaultMessage; - - private Locale fallbackLocale = null; - - /** - * SpEL 解析器 - */ - private static final ExpressionParser PARSER = new SpelExpressionParser(); - - /** - * 表达式缓存 - */ - private static final Map EXPRESSION_CACHE = new HashMap<>(); - - public I18nResponseAdvice(MessageSource messageSource, I18nOptions i18nOptions) { - this.messageSource = messageSource; - - String fallbackLanguageTag = i18nOptions.getFallbackLanguageTag(); - if (fallbackLanguageTag != null) { - String[] arr = fallbackLanguageTag.split("-"); - Assert.isTrue(arr.length == 2, "error fallbackLanguageTag!"); - fallbackLocale = new Locale(arr[0], arr[1]); - } - - this.useCodeAsDefaultMessage = i18nOptions.isUseCodeAsDefaultMessage(); - } - - /** - * 对于使用了 @I18nIgnore 之外的所有接口进行增强处理 - * @param returnType MethodParameter - * @param converterType 消息转换器 - * @return boolean: true is support, false is ignored - */ - @Override - public boolean supports(MethodParameter returnType, Class> converterType) { - AnnotatedElement annotatedElement = returnType.getAnnotatedElement(); - I18nIgnore i18nIgnore = AnnotationUtils.findAnnotation(annotatedElement, I18nIgnore.class); - return i18nIgnore == null; - } - - @Override - public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, - Class> selectedConverterType, ServerHttpRequest request, - ServerHttpResponse response) { - - try { - switchLanguage(body); - } - catch (Exception ex) { - log.error("[国际化]响应体国际化处理异常:{}", body); - } - - return body; - } - - /** - *

- * 对提供了 {@link I18nClass} 注解的类进行国际化处理,递归检查所有属性。 - *

- * ps: 仅处理 String 类型,且注解了 {@link I18nField} 的属性 - * @param source 当前待处理的对象 - */ - public void switchLanguage(Object source) { - if (source == null) { - return; - } - Class sourceClass = source.getClass(); - // 只对添加了 I18nClass 注解的类进行处理 - I18nClass i18nClass = sourceClass.getAnnotation(I18nClass.class); - if (i18nClass == null) { - return; - } - - for (Field field : ReflectUtil.getFields(sourceClass)) { - Class fieldType = field.getType(); - Object fieldValue = ReflectUtil.getFieldValue(source, field); - - if (fieldValue instanceof String) { - // 若不存在国际化注解 直接跳过 - I18nField i18nField = field.getAnnotation(I18nField.class); - if (i18nField == null) { - continue; - } - - // 国际化条件判断 - String conditionExpression = i18nField.condition(); - if (CharSequenceUtil.isNotEmpty(conditionExpression)) { - Expression expression = EXPRESSION_CACHE.computeIfAbsent(conditionExpression, - PARSER::parseExpression); - Boolean needI18n = expression.getValue(source, Boolean.class); - if (needI18n != null && !needI18n) { - continue; - } - } - - // 获取国际化标识 - String code = parseMessageCode(source, (String) fieldValue, i18nField); - if (CharSequenceUtil.isEmpty(code)) { - continue; - } - - // 把当前 field 的值更新为国际化后的属性 - Locale locale = LocaleContextHolder.getLocale(); - String message = codeToMessage(code, locale, (String) fieldValue, fallbackLocale); - ReflectUtil.setFieldValue(source, field, message); - } - else if (fieldValue instanceof Collection) { - @SuppressWarnings("unchecked") - Collection elements = (Collection) fieldValue; - if (CollUtil.isEmpty(elements)) { - continue; - } - // 集合属性 递归处理 - for (Object element : elements) { - switchLanguage(element); - } - } - else if (fieldType.isArray()) { - Object[] elements = (Object[]) fieldValue; - if (elements == null || elements.length == 0) { - continue; - } - // 数组 递归处理 - for (Object element : elements) { - switchLanguage(element); - } - } - else { - // 其他类型的属性,递归判断处理 - switchLanguage(fieldValue); - } - } - } - - /** - * 解析获取国际化code - *
    - *
  • 如果 @I18nField 注解中未指定 code 的 SpEL 表达式, 则使用当前属性值作为 code。 - *
  • 否则使用该表达式解析出来的 code 值。 - *
- * @param source 源对象 - * @param fieldValue 属性值 - * @param i18nField 国际化注解 - * @return String 国际化 code - */ - private String parseMessageCode(Object source, String fieldValue, I18nField i18nField) { - // 如果没有指定 spel,则直接返回属性值 - String codeExpression = i18nField.code(); - if (CharSequenceUtil.isEmpty(codeExpression)) { - return fieldValue; - } - - // 否则解析 spel - Expression expression = EXPRESSION_CACHE.computeIfAbsent(codeExpression, PARSER::parseExpression); - return expression.getValue(source, String.class); - } - - /** - * 转换 code 为对应的国家的语言文本 - * @param code 国际化唯一标识 - * @param locale 当前地区 - * @param fallbackLocale 回退语言 - * @return 国际化 text,或者 code 本身 - */ - private String codeToMessage(String code, Locale locale, String defaultMessage, Locale fallbackLocale) { - String message; - - try { - message = messageSource.getMessage(code, null, locale); - return message; - } - catch (NoSuchMessageException e) { - log.warn("[codeToMessage]未找到对应的国际化配置,code: {}, local: {}", code, locale); - } - - // 当配置了回退语言时,尝试回退 - if (fallbackLocale != null && locale != fallbackLocale) { - try { - message = messageSource.getMessage(code, null, fallbackLocale); - return message; - } - catch (NoSuchMessageException e) { - log.warn("[codeToMessage]期望语言和回退语言中皆未找到对应的国际化配置,code: {}, local: {}, fallbackLocale:{}", code, locale, - fallbackLocale); - } - } - - if (useCodeAsDefaultMessage) { - return code; - } - else { - return defaultMessage; - } - } - -} diff --git a/ad-distribute-common/common-i18n/src/main/java/com/baiye/MessageSourceHierarchicalChanger.java b/ad-distribute-common/common-i18n/src/main/java/com/baiye/MessageSourceHierarchicalChanger.java deleted file mode 100644 index 5bb8177..0000000 --- a/ad-distribute-common/common-i18n/src/main/java/com/baiye/MessageSourceHierarchicalChanger.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baiye; - -import org.springframework.context.HierarchicalMessageSource; -import org.springframework.context.MessageSource; -import org.springframework.context.support.AbstractApplicationContext; - -import javax.annotation.PostConstruct; -import javax.annotation.Resource; - -/** - * 用于修改 MessageSource 的层级关系,保证 DynamicMessageSource 在父级位置,减少开销 - * - * @author hccake - */ -public class MessageSourceHierarchicalChanger { - - @Resource(name = AbstractApplicationContext.MESSAGE_SOURCE_BEAN_NAME) - private MessageSource messageSource; - - @Resource(name = DynamicMessageSource.DYNAMIC_MESSAGE_SOURCE_BEAN_NAME) - private DynamicMessageSource dynamicMessageSource; - - /** - * 将 dynamicMessageSource 置为 messageSource 的父级
- * 若 messageSource 非层级,则将 messageSource 置为 dynamicMessageSource 的父级 - */ - @PostConstruct - public void changeMessageSourceParent() { - // 优先走 messageSource,从资源文件中查找 - if (messageSource instanceof HierarchicalMessageSource) { - HierarchicalMessageSource hierarchicalMessageSource = (HierarchicalMessageSource) messageSource; - MessageSource parentMessageSource = hierarchicalMessageSource.getParentMessageSource(); - dynamicMessageSource.setParentMessageSource(parentMessageSource); - hierarchicalMessageSource.setParentMessageSource(dynamicMessageSource); - } - else { - dynamicMessageSource.setParentMessageSource(messageSource); - } - } - -} \ No newline at end of file diff --git a/ad-distribute-common/common-i18n/src/main/java/com/baiye/WildcardReloadableResourceBundleMessageSource.java b/ad-distribute-common/common-i18n/src/main/java/com/baiye/WildcardReloadableResourceBundleMessageSource.java deleted file mode 100644 index cffdb97..0000000 --- a/ad-distribute-common/common-i18n/src/main/java/com/baiye/WildcardReloadableResourceBundleMessageSource.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.baiye; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.support.ReloadableResourceBundleMessageSource; -import org.springframework.core.io.Resource; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; - -/** - * 通配符支持的 ResourceBundleMessageSource,方便读取多个 jar 包中的资源文件. - * - * 默认的 ReloadableResourceBundleMessageSource,对于多个同名文件,只会读取找到的第一个。 - * - * @see Does - * Spring MessageSource Support Multiple Class Path? - * @author Nicolás Miranda - * @author hccake - */ -@Slf4j -public class WildcardReloadableResourceBundleMessageSource extends ReloadableResourceBundleMessageSource { - - private static final String PROPERTIES_SUFFIX = ".properties"; - - private final PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); - - /** - * Calculate all filenames for the given bundle basename and Locale. Will calculate - * filenames for the given Locale, the system Locale (if applicable), and the default - * file. - * @param basename the basename of the bundle - * @param locale the locale - * @return the List of filenames to check - * @see #setFallbackToSystemLocale - * @see #calculateFilenamesForLocale - */ - @Override - protected List calculateAllFilenames(String basename, Locale locale) { - // 父类默认的方法会将 basename 也放入 filenames 列表 - List filenames = super.calculateAllFilenames(basename, locale); - // 当 basename 有匹配符时,从 filenames 中移除,否则扫描文件将抛出 Illegal char <*> 的异常 - if (basename.contains("*")) { - filenames.remove(basename); - } - return filenames; - } - - @Override - protected List calculateFilenamesForLocale(String basename, Locale locale) { - // 支持 basename 用 . 表示文件层级 - basename = basename.replace(".", "/"); - - // 资源文件名 - List fileNames = new ArrayList<>(); - // 获取到待匹配的国际化信息文件名集合 - List matchFilenames = super.calculateFilenamesForLocale(basename, locale); - for (String matchFilename : matchFilenames) { - try { - Resource[] resources = resolver.getResources("classpath*:" + matchFilename + PROPERTIES_SUFFIX); - for (Resource resource : resources) { - String sourcePath = resource.getURI().toString().replace(PROPERTIES_SUFFIX, ""); - fileNames.add(sourcePath); - } - } - catch (IOException ex) { - log.error("读取国际化信息文件异常", ex); - } - } - return fileNames; - } - -} diff --git a/ad-distribute-common/common-i18n/src/main/resources/ballcat-i18nMessage.properties b/ad-distribute-common/common-i18n/src/main/resources/ballcat-i18nMessage.properties deleted file mode 100644 index 08d62c5..0000000 --- a/ad-distribute-common/common-i18n/src/main/resources/ballcat-i18nMessage.properties +++ /dev/null @@ -1,3 +0,0 @@ -i18nMessage.languageTag=Language Tag -i18nMessage.code=Code -i18nMessage.message=Message \ No newline at end of file diff --git a/ad-distribute-common/common-i18n/src/main/resources/ballcat-i18nMessage_en_US.properties b/ad-distribute-common/common-i18n/src/main/resources/ballcat-i18nMessage_en_US.properties deleted file mode 100644 index 08d62c5..0000000 --- a/ad-distribute-common/common-i18n/src/main/resources/ballcat-i18nMessage_en_US.properties +++ /dev/null @@ -1,3 +0,0 @@ -i18nMessage.languageTag=Language Tag -i18nMessage.code=Code -i18nMessage.message=Message \ No newline at end of file diff --git a/ad-distribute-common/common-i18n/src/main/resources/ballcat-i18nMessage_zh_CN.properties b/ad-distribute-common/common-i18n/src/main/resources/ballcat-i18nMessage_zh_CN.properties deleted file mode 100644 index efa9762..0000000 --- a/ad-distribute-common/common-i18n/src/main/resources/ballcat-i18nMessage_zh_CN.properties +++ /dev/null @@ -1,3 +0,0 @@ -i18nMessage.languageTag=\u8BED\u8A00\u6807\u7B7E -i18nMessage.code=\u56FD\u9645\u5316\u6807\u8BC6 -i18nMessage.message=\u6587\u672C\u503C \ No newline at end of file diff --git a/ad-distribute-common/common-i18n/src/test/java/com/baiye/DefautlI18nMessageProvider.java b/ad-distribute-common/common-i18n/src/test/java/com/baiye/DefautlI18nMessageProvider.java deleted file mode 100644 index 6b90ab7..0000000 --- a/ad-distribute-common/common-i18n/src/test/java/com/baiye/DefautlI18nMessageProvider.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baiye; - -import java.util.Locale; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * 国际化信息的提供者,使用者实现此接口,用于从数据库或者缓存中读取数据 - * - * @author hccake - */ -public class DefautlI18nMessageProvider { - - private static final Map map = new ConcurrentHashMap<>(); - static { - I18nMessage i18nMessage = new I18nMessage(); - i18nMessage.setMessage("你好啊"); - i18nMessage.setCode("test"); - i18nMessage.setLanguageTag("zh-CN"); - map.put("test:zh-CN", i18nMessage); - - I18nMessage i18nMessage2 = new I18nMessage(); - i18nMessage2.setMessage("Hello"); - i18nMessage2.setCode("test"); - i18nMessage2.setLanguageTag("en-US"); - map.put("test:en-US", i18nMessage2); - } - - public I18nMessage getI18nMessage(String code, Locale locale) { - String languageTag = locale.toLanguageTag(); - return map.get(code + ":" + languageTag); - } - -} diff --git a/ad-distribute-common/common-model/src/main/java/com/baiye/result/R.java b/ad-distribute-common/common-model/src/main/java/com/baiye/result/R.java index f016321..fdfc98d 100644 --- a/ad-distribute-common/common-model/src/main/java/com/baiye/result/R.java +++ b/ad-distribute-common/common-model/src/main/java/com/baiye/result/R.java @@ -13,7 +13,7 @@ import java.io.Serializable; * @param * @author Hccake */ -@I18nClass +// @I18nClass @Getter @Setter @ToString diff --git a/ad-distribute-common/pom.xml b/ad-distribute-common/pom.xml index 49e8e64..8158aa1 100644 --- a/ad-distribute-common/pom.xml +++ b/ad-distribute-common/pom.xml @@ -13,7 +13,6 @@ common-core common-desensitize - common-i18n common-idempotent common-log common-model diff --git a/ad-distribute-security/security-oauth2-core/src/main/java/com/baiye/security/util/PasswordUtils.java b/ad-distribute-security/security-oauth2-core/src/main/java/com/baiye/security/util/PasswordUtils.java index 0be4c53..5f5df96 100644 --- a/ad-distribute-security/security-oauth2-core/src/main/java/com/baiye/security/util/PasswordUtils.java +++ b/ad-distribute-security/security-oauth2-core/src/main/java/com/baiye/security/util/PasswordUtils.java @@ -68,7 +68,6 @@ public final class PasswordUtils { byte[] secretKeyBytes = secretKey.getBytes(); AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, secretKeyBytes, secretKeyBytes); byte[] result = aes.decrypt(Base64.decode(aesPass.getBytes(StandardCharsets.UTF_8))); - System.out.println(new String(result, StandardCharsets.UTF_8)); return new String(result, StandardCharsets.UTF_8); } diff --git a/admin/src/main/java/com/baiye/job/JobApplicationRunner.java b/admin/src/main/java/com/baiye/job/JobApplicationRunner.java index 3d37730..eec116c 100644 --- a/admin/src/main/java/com/baiye/job/JobApplicationRunner.java +++ b/admin/src/main/java/com/baiye/job/JobApplicationRunner.java @@ -10,7 +10,6 @@ import com.example.entity.Job; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -31,30 +30,28 @@ public class JobApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) { - // log.info("==============项目启动,自动添加业务中定时任务=============="); - // List distributeTaskEntities = - // distributeTaskMapper.selectList( - // new - // LambdaQueryWrapper().eq(DistributeTaskEntity::getDistributeTaskType, - // 1) - // .eq(DistributeTaskEntity::getTimeStatus, 1) - // .ne(DistributeTaskEntity::getExecuteStatus, 0)); - // - // if (CollUtil.isNotEmpty(distributeTaskEntities)) { - // for (DistributeTaskEntity distributeTaskEntity : distributeTaskEntities) { - // Job job = new Job(); - // job.setJobName(PrefixKeyConstant.JOB_KEY + - // distributeTaskEntity.getDistributeTaskId()); - // String cron = DateTimeToCronUtils.getCron(distributeTaskEntity.getStartTime(), - // DateTimeToCronUtils.EVERYDAY); - // job.setCron(cron); - // job.setJobClass("com.baiye.job.LinkWatchJob"); - // jobService.addJob(job); - // // 暂停 - // if (distributeTaskEntity.getExecuteStatus() == 3) - // jobService.pauseJob(job.getJobName()); - // } - // } + log.info("==============项目启动,自动添加业务中定时任务=============="); + List distributeTaskEntities = distributeTaskMapper.selectList( + new LambdaQueryWrapper().eq(DistributeTaskEntity::getDistributeTaskType, 1) + .eq(DistributeTaskEntity::getTimeStatus, 1) + .ne(DistributeTaskEntity::getExecuteStatus, 0)); + + if (CollUtil.isNotEmpty(distributeTaskEntities)) { + for (DistributeTaskEntity distributeTaskEntity : distributeTaskEntities) { + if (distributeTaskEntity != null && distributeTaskEntity.getStartTime() != null) { + Job job = new Job(); + job.setJobName(PrefixKeyConstant.JOB_KEY + distributeTaskEntity.getDistributeTaskId()); + String cron = DateTimeToCronUtils.getCron(distributeTaskEntity.getStartTime(), + DateTimeToCronUtils.EVERYDAY); + job.setCron(cron); + job.setJobClass("com.baiye.job.LinkWatchJob"); + jobService.addJob(job); + // 暂停 + if (distributeTaskEntity.getExecuteStatus() == 3) + jobService.pauseJob(job.getJobName()); + } + } + } } } diff --git a/admin/src/main/java/com/baiye/job/LinkWatchJob.java b/admin/src/main/java/com/baiye/job/LinkWatchJob.java index 4555b95..3fbf63b 100644 --- a/admin/src/main/java/com/baiye/job/LinkWatchJob.java +++ b/admin/src/main/java/com/baiye/job/LinkWatchJob.java @@ -26,7 +26,10 @@ public class LinkWatchJob implements SimpleJob { String str = jobName.substring(jobName.lastIndexOf("_") + 1); log.info("==============定时任务开始,ID:{}================", str); DistributeTaskEntity entity = distributeTaskService.getById(Long.parseLong(str)); - distributeTaskService.execute(entity); + if (entity != null) { + distributeTaskService.execute(entity); + } + } } diff --git a/admin/src/main/java/com/baiye/modules/distribute/controller/ClueFileController.java b/admin/src/main/java/com/baiye/modules/distribute/controller/ClueFileController.java index 27b0f24..3092957 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/controller/ClueFileController.java +++ b/admin/src/main/java/com/baiye/modules/distribute/controller/ClueFileController.java @@ -1,7 +1,6 @@ package com.baiye.modules.distribute.controller; import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.ExcelWriter; import com.baiye.exception.BadRequestException; import com.baiye.modules.distribute.service.ClueFileService; import com.baiye.result.R; @@ -10,15 +9,9 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import org.springframework.core.io.Resource; -import org.springframework.core.io.ResourceLoader; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Map; @@ -31,12 +24,17 @@ public class ClueFileController { private final ClueFileService clueFileService; - private final ResourceLoader resourceLoader; + @PostMapping("/detection") + @Operation(summary = "校验表头信息") + public R> detection(@RequestParam("file") MultipartFile file) { + return R.ok(clueFileService.detection(file)); + } - @PostMapping("/fileUpload") - @Operation(summary = "文件上传资源") - public R clueFileUpload(@RequestParam("file") MultipartFile file) { - return R.ok(clueFileService.clueFileUpload(file)); + @GetMapping("/readFile") + @Operation(summary = "读取文件信息") + public R readFile(@RequestParam("recordId") Long recordId) { + clueFileService.readFile(recordId); + return R.ok(); } @GetMapping("/export") @@ -47,8 +45,7 @@ public class ClueFileController { response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName); -// EasyExcel.write(response.getOutputStream()).withTemplate(inputStream).sheet().doWrite(null); - final ExcelWriter write = EasyExcel.write(response.getOutputStream()).withTemplate(inputStream).build(); + EasyExcel.write(response.getOutputStream()).withTemplate(inputStream).sheet().doWrite(new ArrayList<>()); } catch (IOException e) { throw new BadRequestException("导出失败,请联系管理员"); diff --git a/admin/src/main/java/com/baiye/modules/distribute/controller/ClueFollowRecordController.java b/admin/src/main/java/com/baiye/modules/distribute/controller/ClueFollowRecordController.java new file mode 100644 index 0000000..9ed27af --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/controller/ClueFollowRecordController.java @@ -0,0 +1,38 @@ +package com.baiye.modules.distribute.controller; + +import com.baiye.modules.distribute.entity.ClueFollowRecordEntity; +import com.baiye.modules.distribute.service.ClueFollowRecordService; +import com.baiye.result.BaseResultCode; +import com.baiye.result.R; +import com.baiye.validation.group.CreateGroup; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RequiredArgsConstructor +@RestController +@Tag(name = "资源跟进记录API") +@RequestMapping("/clueFollow") +public class ClueFollowRecordController { + + private final ClueFollowRecordService clueFollowRecordService; + + @PostMapping("/add") + @Operation(summary = "新增线索跟进记录", description = "新增线索跟进记录") + public R add(@Validated({ CreateGroup.class }) @RequestBody ClueFollowRecordEntity clueStageEntity) { + return clueFollowRecordService.add(clueStageEntity) ? R.ok() + : R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "添加失败"); + } + + @DeleteMapping("/delAll") + @Operation(summary = "ID删除线索阶段") + public R deleteByUserId(@RequestBody List ids) { + return clueFollowRecordService.removeBatchByIds(ids) ? R.ok() + : R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "删除失败"); + } + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/dto/DBPushClueDTO.java b/admin/src/main/java/com/baiye/modules/distribute/dto/DBPushClueDTO.java index a300755..eaa2458 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/dto/DBPushClueDTO.java +++ b/admin/src/main/java/com/baiye/modules/distribute/dto/DBPushClueDTO.java @@ -1,31 +1,28 @@ package com.baiye.modules.distribute.dto; +import cn.hutool.json.JSONArray; import lombok.Data; -/** - * @Author YQY - * @Date 2023/8/7 - */ @Data public class DBPushClueDTO { private String app_id; - private String startTime; + private Long startTime; - private String endTime; + private Long endTime; private String recId; - private String ringTime; + private Long ringTime; - private String talkTime; + private Long talkTime; private String wordId; - private String notConnectStatus; + private Integer notConnectStatus; - private String actId; + private Long actId; private String actType; @@ -45,11 +42,9 @@ public class DBPushClueDTO { private String empClientTypeName; - private String clientVariables; + private JSONArray audioText; - private String audioText; - - private String sender; + private Integer sender; private String context; @@ -57,7 +52,7 @@ public class DBPushClueDTO { private String sms_content; - private String sms_status; + private Integer sms_status; private String remark; diff --git a/admin/src/main/java/com/baiye/modules/distribute/entity/ClueFollowRecordEntity.java b/admin/src/main/java/com/baiye/modules/distribute/entity/ClueFollowRecordEntity.java new file mode 100644 index 0000000..23fef84 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/entity/ClueFollowRecordEntity.java @@ -0,0 +1,46 @@ +package com.baiye.modules.distribute.entity; + +import com.baiye.entity.BaseEntity; +import com.baiye.validation.group.CreateGroup; +import com.baiye.validation.group.UpdateGroup; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +@Getter +@Setter +@ToString +@TableName("tb_clue_follow_record") +@Schema(title = "线索跟进记录表") +public class ClueFollowRecordEntity extends BaseEntity { + + @TableId + @Schema(title = "ID") + @NotNull(message = "ID不能为空", groups = { UpdateGroup.class }) + private Long id; + + @Schema(title = "线索ID") + @NotNull(message = "线索ID不能为空", groups = { CreateGroup.class }) + private Long clueId; + + @Schema(title = "线索阶段ID") + @NotNull(message = "线索阶段ID不能为空", groups = { CreateGroup.class }) + private Long clueStageId; + + @Schema(title = "跟进信息") + private String recordInfo; + + @Schema(title = "跟进信息集合") + @TableField(exist = false) + @NotEmpty(message = "跟进信息不能为空", groups = { CreateGroup.class }) + private List recordInfoList; + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/entity/ClueStageEntity.java b/admin/src/main/java/com/baiye/modules/distribute/entity/ClueStageEntity.java index beaa41d..eed6a8d 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/entity/ClueStageEntity.java +++ b/admin/src/main/java/com/baiye/modules/distribute/entity/ClueStageEntity.java @@ -3,6 +3,7 @@ package com.baiye.modules.distribute.entity; import com.baiye.entity.BaseEntity; import com.baiye.validation.group.CreateGroup; import com.baiye.validation.group.UpdateGroup; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.v3.oas.annotations.media.Schema; @@ -12,6 +13,7 @@ import lombok.ToString; import org.springframework.validation.annotation.Validated; import javax.validation.constraints.NotNull; +import java.util.List; /** * @Author YQY @@ -40,4 +42,8 @@ public class ClueStageEntity extends BaseEntity { @NotNull(message = "线索阶段排序不能为空", groups = { CreateGroup.class }) private Integer sort; + @Schema(title = "线索阶段记录") + @TableField(exist = false) + private List clueFollowRecordList; + } diff --git a/admin/src/main/java/com/baiye/modules/distribute/entity/DistributeTaskEntity.java b/admin/src/main/java/com/baiye/modules/distribute/entity/DistributeTaskEntity.java index 75912d3..8d33ebe 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/entity/DistributeTaskEntity.java +++ b/admin/src/main/java/com/baiye/modules/distribute/entity/DistributeTaskEntity.java @@ -36,10 +36,10 @@ public class DistributeTaskEntity extends BaseEntity { private String taskName; @Schema(title = "分发规则 0:平均 1:权重") - private Integer ruleStatus = 0; + private Integer ruleStatus; @Schema(title = "分发时间 0:实时 1:定时") - private Integer timeStatus = 1; + private Integer timeStatus; @Schema(title = "定时开始时间") private LocalDateTime startTime; diff --git a/admin/src/main/java/com/baiye/modules/distribute/mapper/ClueFollowRecordMapper.java b/admin/src/main/java/com/baiye/modules/distribute/mapper/ClueFollowRecordMapper.java new file mode 100644 index 0000000..1c0063f --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/mapper/ClueFollowRecordMapper.java @@ -0,0 +1,8 @@ +package com.baiye.modules.distribute.mapper; + +import com.baiye.extend.mybatis.plus.mapper.ExtendMapper; +import com.baiye.modules.distribute.entity.ClueFollowRecordEntity; + +public interface ClueFollowRecordMapper extends ExtendMapper { + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/mapper/ClueRecordMapper.java b/admin/src/main/java/com/baiye/modules/distribute/mapper/ClueRecordMapper.java index 782e6a9..6777a58 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/mapper/ClueRecordMapper.java +++ b/admin/src/main/java/com/baiye/modules/distribute/mapper/ClueRecordMapper.java @@ -41,7 +41,8 @@ public interface ClueRecordMapper extends ExtendMapper { IPage selectByPage(IPage page, @Param(Constants.WRAPPER) Wrapper wrapper); - void updateAllocationStatus(@Param("list") List recordIdList, @Param("status") Integer status); + void updateAllocationStatusAndDistributeStatus(@Param("list") List recordIdList, + @Param("status") Integer status, @Param("distributeStatus") Integer distributeStatus); void updateDistributeStatus(@Param("list") List recordIdList, @Param("status") Integer status); diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/ClueFileService.java b/admin/src/main/java/com/baiye/modules/distribute/service/ClueFileService.java index 20ca82e..90af838 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/service/ClueFileService.java +++ b/admin/src/main/java/com/baiye/modules/distribute/service/ClueFileService.java @@ -6,10 +6,15 @@ import java.util.Map; public interface ClueFileService { + /** + * 检测文件格式 + */ + Map detection(MultipartFile file); + /** * 文件上传资源 */ - Map clueFileUpload(MultipartFile file); + void readFile(Long recordId); /** * 生成秘钥 diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/ClueFollowRecordService.java b/admin/src/main/java/com/baiye/modules/distribute/service/ClueFollowRecordService.java new file mode 100644 index 0000000..b044d15 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/service/ClueFollowRecordService.java @@ -0,0 +1,10 @@ +package com.baiye.modules.distribute.service; + +import com.baiye.extend.mybatis.plus.service.ExtendService; +import com.baiye.modules.distribute.entity.ClueFollowRecordEntity; + +public interface ClueFollowRecordService extends ExtendService { + + boolean add(ClueFollowRecordEntity clueStageEntity); + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/ClueFileServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/ClueFileServiceImpl.java index f9622db..fa09c2a 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/service/impl/ClueFileServiceImpl.java +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/ClueFileServiceImpl.java @@ -1,5 +1,6 @@ package com.baiye.modules.distribute.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.poi.excel.ExcelReader; import com.baiye.constant.DefaultNumberConstants; @@ -44,7 +45,7 @@ public class ClueFileServiceImpl implements ClueFileService { private final SyncTask syncTask; @Override - public Map clueFileUpload(MultipartFile multipartFile) { + public Map detection(MultipartFile multipartFile) { // 检测文件的内容格式 ExcelReader excelReader = ClueFileTestingUtil.testingExcel(multipartFile); // 保存文件 @@ -62,23 +63,28 @@ public class ClueFileServiceImpl implements ClueFileService { // 获取文件中第一行数据的来源字段 null为未知 List oneReadList = excelReader.readRow(DefaultNumberConstants.ZERO_NUMBER); List twoReadList = excelReader.readRow(DefaultNumberConstants.ONE_NUMBER); - int index = oneReadList.indexOf(UploadTemplateHeadConstant.HEAD_ORIGIN); - String channelStr = (String) twoReadList.get(index); - if (StringUtils.isBlank(channelStr)) - channelStr = "未知"; - clueRecordEntity.setChannelType(SecurityUtils.getUser().getUsername() + "-" + channelStr); - clueRecordEntity.setChannelIdentifying(channelStr); + if (CollUtil.isNotEmpty(twoReadList)) { + int index = oneReadList.indexOf(UploadTemplateHeadConstant.HEAD_ORIGIN); + String channelStr = (String) twoReadList.get(index); + if (StringUtils.isBlank(channelStr)) + channelStr = "未知"; + clueRecordEntity.setChannelType(SecurityUtils.getUser().getUsername() + "-" + channelStr); + clueRecordEntity.setChannelIdentifying(channelStr); + } clueRecordService.save(clueRecordEntity); - - // 异步读取资源 - syncTask.clueUpload(clueRecordEntity); - Map returnMap = new HashMap<>(); returnMap.put("excelHead", oneReadList); returnMap.put("clueRecordId", clueRecordEntity.getClueRecordId()); return returnMap; } + @Override + public void readFile(Long recordId) { + ClueRecordEntity clueRecordEntity = clueRecordService.getById(recordId); + // 异步读取资源 + syncTask.clueUpload(clueRecordEntity); + } + @Override public Map generateSecretKey() { Map map = new HashMap<>(); diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/ClueFollowRecordServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/ClueFollowRecordServiceImpl.java new file mode 100644 index 0000000..974b23b --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/ClueFollowRecordServiceImpl.java @@ -0,0 +1,35 @@ +package com.baiye.modules.distribute.service.impl; + +import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl; +import com.baiye.modules.distribute.entity.ClueFollowRecordEntity; +import com.baiye.modules.distribute.mapper.ClueFollowRecordMapper; +import com.baiye.modules.distribute.service.ClueFollowRecordService; +import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +@Service +@Slf4j +public class ClueFollowRecordServiceImpl extends ExtendServiceImpl + implements ClueFollowRecordService { + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean add(ClueFollowRecordEntity entity) { + List list = new ArrayList<>(); + List recordInfoList = entity.getRecordInfoList(); + for (String recordInfo : recordInfoList) { + ClueFollowRecordEntity clueFollowRecordEntity = new ClueFollowRecordEntity(); + BeanUtils.copyProperties(entity, clueFollowRecordEntity); + clueFollowRecordEntity.setRecordInfo(recordInfo); + list.add(clueFollowRecordEntity); + } + return SqlHelper.retBool(baseMapper.insertBatchSomeColumn(list)); + } + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/ClueRecordServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/ClueRecordServiceImpl.java index 92f53fa..0c72f90 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/service/impl/ClueRecordServiceImpl.java +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/ClueRecordServiceImpl.java @@ -36,7 +36,8 @@ public class ClueRecordServiceImpl extends ExtendServiceImpl i private final ClueStageService clueStageService; + private final ClueFollowRecordMapper clueFollowRecordMapper; + private final SecurityProperties securityProperties; @Override @@ -95,20 +100,23 @@ public class ClueServiceImpl extends ExtendServiceImpl i if (CollUtil.isNotEmpty(recordList)) { for (ClueVO record : recordList) { - // 手机号隐藏中间4位 + // // 手机号隐藏中间4位 String decryptNid = AESUtils.decrypt(record.getNid(), securityProperties.getPasswordSecretKey()); if (StringUtils.isNotBlank(decryptNid)) { - StringBuilder stringBuilder = new StringBuilder(decryptNid); - String nid = stringBuilder.replace(3, 7, "****").toString(); - record.setNid(nid); + // StringBuilder stringBuilder = new StringBuilder(decryptNid); + // String nid = stringBuilder.replace(3, 7, "****").toString(); + record.setNid(decryptNid); } else { record.setNid(""); } // 转换标签 - JSONArray array = JSONUtil.parseArray(record.getClueLabelName()); - record.setClueLabelList(JSONUtil.toList(array, String.class)); - record.setClueLabelName(""); + String clueLabelName = record.getClueLabelName(); + if (StringUtils.isNotBlank(clueLabelName)) { + JSONArray array = JSONUtil.parseArray(clueLabelName); + record.setClueLabelList(JSONUtil.toList(array, String.class)); + record.setClueLabelName(""); + } } } return pageResult; @@ -129,6 +137,17 @@ public class ClueServiceImpl extends ExtendServiceImpl i List nameList = clueLabelList.stream().map(LabelEntity::getLabelName).collect(Collectors.toList()); clueEntity.setClueLabelName(JSONUtil.toJsonStr(nameList)); } + else { + // 修改标签为空 + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(ClueEntity::getClueId, clueDTO.getClueId()); + updateWrapper.set(ClueEntity::getClueLabel, null); + updateWrapper.set(ClueEntity::getClueLabelName, null); + baseMapper.update(null, updateWrapper); + + clueEntity.setClueLabelName(null); + clueEntity.setClueLabel(null); + } return SqlHelper.retBool(baseMapper.updateById(clueEntity)); } @@ -144,7 +163,25 @@ public class ClueServiceImpl extends ExtendServiceImpl i List organizeEntities = labelOrganizeService.queryUserList(whichUserId); // 查询上级用户阶段 List clueStageEntities = clueStageService.queryUserList(whichUserId); - + if (CollUtil.isNotEmpty(clueStageEntities)) { + List clueStageIds = clueStageEntities.stream() + .map(ClueStageEntity::getClueStageId) + .collect(Collectors.toList()); + // 查询阶段的记录 + List clueFollowRecordEntities = clueFollowRecordMapper.selectList( + new LambdaQueryWrapper().eq(ClueFollowRecordEntity::getClueId, clueId) + .in(ClueFollowRecordEntity::getClueStageId, clueStageIds)); + // 记录放入阶段中 + if (CollUtil.isNotEmpty(clueFollowRecordEntities)) { + Map> map = clueFollowRecordEntities.stream() + .collect(Collectors.groupingBy(ClueFollowRecordEntity::getClueStageId)); + for (ClueStageEntity clueStageEntity : clueStageEntities) { + if (map.containsKey(clueStageEntity.getClueStageId())) { + clueStageEntity.setClueFollowRecordList(map.get(clueStageEntity.getClueStageId())); + } + } + } + } clueVO.setOrganizeEntities(organizeEntities); clueVO.setClueStageEntities(clueStageEntities); diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/DistributeTaskServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/DistributeTaskServiceImpl.java index 0965685..d4539e3 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/service/impl/DistributeTaskServiceImpl.java +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/DistributeTaskServiceImpl.java @@ -29,7 +29,6 @@ import com.baiye.system.service.SysUserService; import com.baiye.utils.AssignDataUtil; import com.baiye.utils.DateTimeToCronUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; import com.example.entity.Job; import lombok.RequiredArgsConstructor; @@ -125,26 +124,16 @@ public class DistributeTaskServiceImpl extends ExtendServiceImpl updateSysUserList = new ArrayList<>(); - List sysUsers = sysUserService.listByUserIds(userIdList); - Map> userIdMap = sysUsers.stream().collect(Collectors.groupingBy(SysUser::getUserId)); - // 获取文件中未分配的资源ID - List clueIds = clueService.findUndistributedClueIds(recordIdList); - // 分配 - DistributeDTO distributeDTO = new DistributeDTO(); - distributeDTO.setDeptIds(userIdList); - distributeDTO.setResourceList(clueIds); - if (taskEntity.getRuleStatus() == DefaultNumberConstants.ONE_NUMBER) { - distributeDTO.setIsWeight(true); - List weightList = userEntities.stream() - .map(DistributeTaskUserEntity::getWeight) - .collect(Collectors.toList()); - List weights = weightList.stream().map(i -> i * 10.0).collect(Collectors.toList()); - distributeDTO.setWeights(weights); - } - // 查询业务管理员用户的默认文件记录 - Map> map = null; - if (createBy == 1) { - List recordEntities = clueRecordMapper - .selectList(new LambdaQueryWrapper().in(ClueRecordEntity::getCreateBy, userIdList) - .eq(ClueRecordEntity::getRecordType, DefaultNumberConstants.ONE_NUMBER)); - map = recordEntities.stream().collect(Collectors.groupingBy(ClueRecordEntity::getCreateBy)); - } - // 分配数据 - List clueEntityList = new ArrayList<>(); - List responseDTOS = AssignDataUtil.assignData(distributeDTO); - // 更新分配信息 - for (DistributeResponseDTO responseDTO : responseDTOS) { - // 用户分发量修改 - if (userIdMap.containsKey(responseDTO.getDeptId())) { - SysUser sysUser = userIdMap.get(responseDTO.getDeptId()).get(0); - sysUser.setDistributeNum(sysUser.getDistributeNum() + responseDTO.getResponseList().size()); - updateSysUserList.add(sysUser); - } - Long assignedBy = responseDTO.getDeptId(); - for (Long clueId : responseDTO.getResponseList()) { - ClueEntity clueEntity = new ClueEntity(); - clueEntity.setClueId(clueId); - // 业务员更新的是分配人,否则是admin给业务管理员分配(分配到默认创建的记录中) - if (createBy != 1) { - clueEntity.setAssignedBy(assignedBy); - if (userIdMap.containsKey(assignedBy)) { - SysUser sysUser = userIdMap.get(assignedBy).get(0); - clueEntity.setAssignedName(sysUser.getUsername()); - } + + if (CollUtil.isNotEmpty(recordIdList)) { + // 查询分配人用户信息 + List updateSysUserList = new ArrayList<>(); + List sysUsers = sysUserService.listByUserIds(userIdList); + Map> userIdMap = sysUsers.stream() + .collect(Collectors.groupingBy(SysUser::getUserId)); + // 获取文件中未分配的资源 + List clueIds = clueService.findUndistributedClueIds(recordIdList); + // 分配 + if (CollUtil.isNotEmpty(clueIds)) { + DistributeDTO distributeDTO = new DistributeDTO(); + distributeDTO.setDeptIds(userIdList); + distributeDTO.setResourceList(clueIds); + if (taskEntity.getRuleStatus() == DefaultNumberConstants.ONE_NUMBER) { + distributeDTO.setIsWeight(true); + List weightList = userEntities.stream() + .map(DistributeTaskUserEntity::getWeight) + .collect(Collectors.toList()); + List weights = weightList.stream().map(i -> i * 10.0).collect(Collectors.toList()); + distributeDTO.setWeights(weights); + } + List responseDTOS = AssignDataUtil.assignData(distributeDTO); + // 查询业务管理员用户的默认文件记录 + Map> map = null; + if (createBy == 1) { + List recordEntities = clueRecordMapper.selectList( + new LambdaQueryWrapper().in(ClueRecordEntity::getCreateBy, userIdList) + .eq(ClueRecordEntity::getRecordType, DefaultNumberConstants.ONE_NUMBER)); + map = recordEntities.stream().collect(Collectors.groupingBy(ClueRecordEntity::getCreateBy)); } - // admin给业务管理员分配 改变线索的记录ID即可 - else { - if (CollUtil.isNotEmpty(map) && map.containsKey(assignedBy)) { - ClueRecordEntity clueRecordEntity = map.get(assignedBy).get(0); - clueEntity.setClueRecordId(clueRecordEntity.getClueRecordId()); + List clueEntityList = new ArrayList<>(); + // 更新分配信息 + for (DistributeResponseDTO responseDTO : responseDTOS) { + // 用户分发量修改 + if (userIdMap.containsKey(responseDTO.getDeptId())) { + SysUser sysUser = userIdMap.get(responseDTO.getDeptId()).get(0); + sysUser.setDistributeNum(sysUser.getDistributeNum() + responseDTO.getResponseList().size()); + updateSysUserList.add(sysUser); + } + Long assignedBy = responseDTO.getDeptId(); + for (Long clueId : responseDTO.getResponseList()) { + ClueEntity clueEntity = new ClueEntity(); + clueEntity.setClueId(clueId); + // 业务员更新的是分配人,否则是admin给业务管理员分配(分配到默认创建的记录中) + if (createBy != 1) { + clueEntity.setAssignedBy(assignedBy); + if (userIdMap.containsKey(assignedBy)) { + SysUser sysUser = userIdMap.get(assignedBy).get(0); + clueEntity.setAssignedName(sysUser.getUsername()); + } + } + // admin给业务管理员分配 改变线索的记录ID即可 + else { + if (CollUtil.isNotEmpty(map) && map.containsKey(assignedBy)) { + ClueRecordEntity clueRecordEntity = map.get(assignedBy).get(0); + clueEntity.setClueRecordId(clueRecordEntity.getClueRecordId()); + } + } + // 批量修改数据 + clueEntityList.add(clueEntity); + if (clueEntityList.size() >= 3000) { + clueService.updateBatchById(clueEntityList); + clueEntityList.clear(); + } } } // 批量修改数据 - clueEntityList.add(clueEntity); - if (clueEntityList.size() >= 3000) { + if (CollUtil.isNotEmpty(clueEntityList)) { clueService.updateBatchById(clueEntityList); - clueEntityList.clear(); } - } - } - // 批量修改数据 - if (CollUtil.isNotEmpty(clueEntityList)) { - clueService.updateBatchById(clueEntityList); - } - // 用户分发量修改 - sysUserService.updateDistributeNum(updateSysUserList); - // 修改任务执行次数+1 - baseMapper.updateByExecuteNumAddOne(taskEntity.getDistributeTaskId()); - // 修改记录分配状态 - if (CollUtil.isNotEmpty(recordIdList)) - clueRecordMapper.updateAllocationStatus(recordIdList, 1); - // 异步分发下级任务 - if (taskEntity.getCreateBy() == 1) { - List taskEntities = baseMapper.selectList( - new LambdaQueryWrapper().eq(DistributeTaskEntity::getDefaultType, 0) - .in(DistributeTaskEntity::getCreateBy, userIdList)); - if (CollUtil.isNotEmpty(taskEntities)) { - List list = taskEntities.stream() - .map(DistributeTaskEntity::getDistributeTaskId) - .collect(Collectors.toList()); - this.syncExecuteTask(list); + // 用户分发量修改 + sysUserService.updateDistributeNum(updateSysUserList); + // 修改任务执行次数+1 + baseMapper.updateByExecuteNumAddOne(taskEntity.getDistributeTaskId()); + // 修改记录分配状态 + if (CollUtil.isNotEmpty(recordIdList)) { + clueRecordMapper.updateAllocationStatusAndDistributeStatus(recordIdList, 1, 1); + } + // 分发下级任务 + if (taskEntity.getCreateBy() == 1) { + this.syncExecuteTask(userIdList); + } } } } @@ -556,10 +542,19 @@ public class DistributeTaskServiceImpl extends ExtendServiceImpl taskIds) { - List distributeTaskEntities = baseMapper.selectBatchIds(taskIds); - for (DistributeTaskEntity distributeTaskEntity : distributeTaskEntities) { - this.execute(distributeTaskEntity); + private void syncExecuteTask(List userIdList) { + List taskEntities = baseMapper + .selectList(new LambdaQueryWrapper().eq(DistributeTaskEntity::getDefaultType, 0) + .in(DistributeTaskEntity::getCreateBy, userIdList)); + if (CollUtil.isNotEmpty(taskEntities)) { + for (DistributeTaskEntity distributeTaskEntity : taskEntities) { + Integer executeStatus = distributeTaskEntity.getExecuteStatus(); + Integer distributeTaskType = distributeTaskEntity.getDistributeTaskType(); + Integer timeStatus = distributeTaskEntity.getTimeStatus(); + if ((distributeTaskType == 1 && timeStatus == 0) && executeStatus != 0 && executeStatus != 3) { + this.execute(distributeTaskEntity); + } + } } } diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/OutsideReqServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/OutsideReqServiceImpl.java index 5505ba3..403fa44 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/service/impl/OutsideReqServiceImpl.java +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/OutsideReqServiceImpl.java @@ -75,7 +75,7 @@ public class OutsideReqServiceImpl implements OutsideReqService { new LambdaQueryWrapper().eq(DistributeTaskEntity::getDefaultType, 0) .eq(DistributeTaskEntity::getCreateBy, linkEntity.getCreateBy()) .eq(DistributeTaskEntity::getFileRecordId, linkEntity.getClueRecordId())); - if (entity.getExecuteStatus() != 1 && entity.getExecuteStatus() != 3) + if (entity.getExecuteStatus() != 0 && entity.getExecuteStatus() != 3) distributeTaskService.execute(entity); } diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/PushLinkServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/PushLinkServiceImpl.java index 1bd5dcb..96f7518 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/service/impl/PushLinkServiceImpl.java +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/PushLinkServiceImpl.java @@ -39,7 +39,7 @@ public class PushLinkServiceImpl extends ExtendServiceImpl().eq(PushLinkEntity::getUserId, userId)); if (pushLinkEntity != null) { - dbPushUrl = dbPushUrl.concat(pushLinkEntity.getAppKey()); + dbPushUrl = dbPushUrl.concat(pushLinkEntity.getAppKey()).concat("?dataType=detail&encrypt=1"); } else { // 生成的appKey标识重复,重新生成 @@ -51,7 +51,7 @@ public class PushLinkServiceImpl extends ExtendServiceImpl rowData = reader.readRow(1); + if (CollUtil.isEmpty(rowData)) { + throw new BadRequestException("空文件,请检查文件内容"); + } if (rowCount > 1000000) throw new BadRequestException("文件行数不得超过100w行,请处理"); return reader; diff --git a/admin/src/main/resources/application-dev.yml b/admin/src/main/resources/application-dev.yml index 54263b9..5f3cc76 100644 --- a/admin/src/main/resources/application-dev.yml +++ b/admin/src/main/resources/application-dev.yml @@ -19,7 +19,7 @@ business: urls: - dbPushUrl: https://aidrop.z48.cn/outside/pushClue/ + dbPushUrl: http://cs.tuoz.net:8100/outside/pushClue/ springdoc: swagger-ui: diff --git a/admin/src/main/resources/application-prod.yml b/admin/src/main/resources/application-prod.yml index a10557b..5edeab7 100644 --- a/admin/src/main/resources/application-prod.yml +++ b/admin/src/main/resources/application-prod.yml @@ -1,25 +1,25 @@ spring: datasource: - url: jdbc:mysql://localhost:3306/ballcat?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai + url: jdbc:mysql://localhost:3306/ad_distribute?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai username: root password: 7f2vvawx redis: - host: ballcat-redis + host: localhost password: '' port: 6379 -# 日志文件地址,配置此属性以便 SBA 在线查看日志 -logging: - file: - path: logs/@artifactId@ - name: ${logging.file.path}/output.log + +business: + roleCodes: + # admin超级管理员 + - ROLE_ADMIN + # 业务管理员 + - ROLE_SALES_EXECUTIVE + +urls: + dbPushUrl: https://baiyea.net/api/outside/pushClue/ # 生产环境关闭文档 ballcat: openapi: - enabled: false - oss: - bucket: your-bucket-here - endpoint: http://oss-cn-shanghai.aliyuncs.com - access-key: your key here - access-secret: your secret here \ No newline at end of file + enabled: false \ No newline at end of file diff --git a/admin/src/main/resources/application-test.yml b/admin/src/main/resources/application-test.yml index 4a94cf0..c0c9e48 100644 --- a/admin/src/main/resources/application-test.yml +++ b/admin/src/main/resources/application-test.yml @@ -18,7 +18,7 @@ business: - ROLE_SALES_EXECUTIVE urls: - dbPushUrl: https://aidrop.z48.cn/outside/pushClue/ + dbPushUrl: http://cs.tuoz.net:8100/outside/pushClue/ springdoc: swagger-ui: diff --git a/admin/src/main/resources/application.yml b/admin/src/main/resources/application.yml index 4033e77..1e031b1 100644 --- a/admin/src/main/resources/application.yml +++ b/admin/src/main/resources/application.yml @@ -5,11 +5,7 @@ spring: application: name: @artifactId@ profiles: - active: dev # 当前激活配置,默认dev - messages: - # basename 中的 . 和 / 都可以用来表示文件层级,默认的 basename 是 messages - # 必须注册此 basename, 否则 security 错误信息将一直都是英文 - basename: 'ballcat-*, org.springframework.security.messages' + active: dev # 天爱图形验证码 captcha: @@ -58,38 +54,6 @@ ballcat: # 项目 redis 缓存的 key 前缀 redis: key-prefix: 'ballcat:' - # actuator 加解密密钥 - actuator: - auth: true - secret-id: 'ballcat-monitor' - secret-key: '=BallCat-Monitor' - openapi: - info: - title: BallCat-Admin Docs - description: BallCat 后台管理服务Api文档 - version: ${project.version} - terms-of-service: http://www.ballcat.cn/ - license: - name: Powered By BallCat - url: http://www.ballcat.cn/ - contact: - name: Hccake - email: chengbohua@foxmail.com - url: https://github.com/Hccake - components: - security-schemes: - apiKey: - type: APIKEY - in: HEADER - name: 'api-key' - oauth2: - type: OAUTH2 - flows: - password: - token-url: /oauth/token - security: - - oauth2: [ ] - - apiKey: [ ] springdoc: # 开启 oauth2 端点显示 diff --git a/admin/src/main/resources/file/template.xlsx b/admin/src/main/resources/file/template.xlsx index 2db65d75e192485f99fcd554e6c8ef98dccb9594..ae0c38321f7eccc4ceb9db133d35078380a18368 100644 GIT binary patch delta 6015 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 F{x5)|Na_Fp delta 6277 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 diff --git a/admin/src/main/resources/logback-spring.xml b/admin/src/main/resources/logback-spring.xml index 6f98044..7c383f1 100644 --- a/admin/src/main/resources/logback-spring.xml +++ b/admin/src/main/resources/logback-spring.xml @@ -11,7 +11,7 @@ - %highlight([%-5level]) %cyan(%d{yyyy-MM-dd#HH:mm:ss.SSS} [userId-%X{userId}] [reqUrl-%X{reqUrl}]) %yellow([Thread:%thread]) %magenta([Logger:%logger]) -> %msg%n + %highlight([%-5level]) %cyan(%d{yyyy-MM-dd#HH:mm:ss.SSS}) %yellow([Thread:%thread]) %magenta([Logger:%logger]) -> %msg%n utf-8 diff --git a/admin/src/main/resources/mapper/ClueRecordMapper.xml b/admin/src/main/resources/mapper/ClueRecordMapper.xml index 46bbd02..566fb7a 100644 --- a/admin/src/main/resources/mapper/ClueRecordMapper.xml +++ b/admin/src/main/resources/mapper/ClueRecordMapper.xml @@ -49,11 +49,12 @@ - + UPDATE tb_clue_record SET - allocation_status = #{status} + allocation_status = #{status}, + distribute_status = #{distributeStatus} where clue_record_id = #{list[0]}